Aktualisierte, neue Antwort
Ich habe dafür eine Quelldistribution NuGet geschrieben, die eine einzelne Datei mit zwei benutzerdefinierten Vertragsauflösern installiert:
- PrivateSetterContractResolver
- PrivateSetterCamelCasePropertyNamesContractResolver
Installieren Sie das NuGet:
Install-Package JsonNet.PrivateSettersContractResolvers.Source
Verwenden Sie dann einfach einen der Resolver:
var settings = new JsonSerializerSettings
{
ContractResolver = new PrivateSetterContractResolver()
};
var model = JsonConvert.DeserializeObject<Model>(json, settings);
Sie können darüber hier lesen: http://danielwertheim.se/json-net-private-setters-nuget/
GitHub-Repo: https://github.com/danielwertheim/jsonnet-privatesetterscontractresolvers
Alte Antwort (noch gültig)
Es gibt zwei Alternativen, die das Problem lösen können.
Alt 1: Auf den Deserialisierern
ContractResolver.DefaultMembersSearchFlags =
DefaultMembersSearchFlags | BindingFlags.NonPublic;
Die Standard-Serialisierungsoption unterstützt alle Arten von Klassenmitgliedern. Daher gibt diese Lösung alle privaten Mitgliedstypen einschließlich Felder zurück. Ich bin nur daran interessiert, auch private Setter zu unterstützen.
Alt2: Erstellen Sie einen benutzerdefinierten ContractResolver:
Daher ist dies die bessere Option, da wir nur die Eigenschaften überprüfen.
public class SisoJsonDefaultContractResolver : DefaultContractResolver
{
protected override JsonProperty CreateProperty(
MemberInfo member,
MemberSerialization memberSerialization)
{
//TODO: Maybe cache
var prop = base.CreateProperty(member, memberSerialization);
if (!prop.Writable)
{
var property = member as PropertyInfo;
if (property != null)
{
var hasPrivateSetter = property.GetSetMethod(true) != null;
prop.Writable = hasPrivateSetter;
}
}
return prop;
}
}
Weitere Informationen finden Sie in meinem Beitrag: http://danielwertheim.se/json-net-private-setters/