Je sais qu'il existe un attribut pour gérer les setters privés, mais je veux un peu ce comportement par défaut, y a-t-il un moyen d'accomplir cela? Sauf en modifiant la source. Ce serait génial s'il y avait un cadre pour cela.
Je suis venu ici à la recherche de l'attribut réel qui fait que Json.NET remplit une propriété en lecture seule lors de la désérialisation, et c'est simplement [JsonProperty], par exemple:
var settings =newJsonSerializerSettings{ContractResolver=newPrivateSetterContractResolver()};var model =JsonConvert.DeserializeObject<Model>(json, settings);
L'option de sérialisation par défaut prend en charge tous les types de membres de classe. Par conséquent, cette solution renverra tous les types de membres privés, y compris les champs. Je suis seulement intéressé à soutenir également les setters privés.
Alt2: Créez un ContractResolver personnalisé:
Par conséquent, ce sont les meilleures options puisque nous vérifions simplement les propriétés.
On dirait que Alt 2 est définitivement la voie à suivre de nos jours. DefaultMembersSearchFlagsest obsolète .
Todd Menier le
4
Avec c # 6, {get; }n'est PAS équivalent à { get; private set; }. Pour la première manière property.GetSetMethod(true)revient nullet la seconde true. Cela m'a surpris. Vous devez avoir private set;pour que la désérialisation fonctionne comme prévu.
La réponse de @ Daniel (Alt2) est parfaite, mais j'en avais besoin pour fonctionner à la fois pour les setters privés et les getters (je travaille avec une API qui contient en fait quelques éléments en écriture seule, comme user.password.) Voici ce que j'ai obtenu:
Réponses:
Je suis venu ici à la recherche de l'attribut réel qui fait que Json.NET remplit une propriété en lecture seule lors de la désérialisation, et c'est simplement
[JsonProperty]
, par exemple:Solution alternative
Fournissez simplement un constructeur qui a un paramètre correspondant à votre propriété:
Maintenant cela fonctionne:
Je préfère cette approche dans la mesure du possible car:
{ get; private set; }
et juste{ get; }
.la source
{get;private set;}
, pas avec{get;}
{ get; }
si le type a un constructeur avec un paramètre correspondant au nom de la propriété.Mise à jour, nouvelle réponse
J'ai écrit une distribution source NuGet pour cela, qui installe un seul fichier avec deux résolveurs de contrat personnalisés:
Installez le NuGet:
Ensuite, utilisez simplement l'un des résolveurs:
Vous pouvez en savoir plus ici: http://danielwertheim.se/json-net-private-setters-nuget/
Repo GitHub: https://github.com/danielwertheim/jsonnet-privatesetterscontractresolvers
Ancienne réponse (toujours valide)
Il existe deux alternatives qui peuvent résoudre le problème.
Alt 1: sur les désérialiseurs
L'option de sérialisation par défaut prend en charge tous les types de membres de classe. Par conséquent, cette solution renverra tous les types de membres privés, y compris les champs. Je suis seulement intéressé à soutenir également les setters privés.
Alt2: Créez un ContractResolver personnalisé:
Par conséquent, ce sont les meilleures options puisque nous vérifions simplement les propriétés.
Pour plus d'informations, lisez mon article: http://danielwertheim.se/json-net-private-setters/
la source
DefaultMembersSearchFlags
est obsolète .{get; }
n'est PAS équivalent à{ get; private set; }
. Pour la première manièreproperty.GetSetMethod(true)
revientnull
et la secondetrue
. Cela m'a surpris. Vous devez avoirprivate set;
pour que la désérialisation fonctionne comme prévu.La réponse de @ Daniel (Alt2) est parfaite, mais j'en avais besoin pour fonctionner à la fois pour les setters privés et les getters (je travaille avec une API qui contient en fait quelques éléments en écriture seule, comme
user.password
.) Voici ce que j'ai obtenu:Enregistré ainsi:
la source