2016-06-21 8 views
4

Gibt es eine Möglichkeit, Json.NET [JsonIgnore] Attribut für eine Klasse zu ignorieren, die ich keine Berechtigung zum Ändern/zu erweitern?Ignore [JsonIgnore] Attribut bei Serialisierung/Deserialisierung

Ich brauche alle Eigenschaften in dieser Klasse serialisiert/deserialisiert. Ich habe versucht, Subklassen Json.NET der DefaultContractResolver Klasse und überschreiben, was die entsprechende Methode, um aussieht:

public class JsonIgnoreAttributeIgnorerContractResolver : DefaultContractResolver 
{ 
    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) 
    { 
     JsonProperty property = base.CreateProperty(member, memberSerialization); 

     // Serialize all the properties 
     property.ShouldSerialize = _ => true; 

     return property; 
    } 
} 

aber das Attribut auf der ursprünglichen Klasse scheint immer zu gewinnen:

public static void Serialize() 
{ 
    string serialized = JsonConvert.SerializeObject(
     new CannotModify { Keep = 1, Ignore = 2 }, 
     new JsonSerializerSettings { ContractResolver = new JsonIgnoreAttributeIgnorerContractResolver() }); 

    // Actual: {"Keep":1} 
    // Desired: {"Keep":1,"Ignore":2} 
} 

ich tiefer gegraben, und fand eine Schnittstelle namens IAttributeProvider die eingestellt werden können (es hatte einen Wert von „Ignorieren“ für die Ignore Eigenschaft, so dass ein Hinweis war dies sein könnte, etwas, das geändert werden muss):

... 
property.ShouldSerialize = _ => true; 
property.AttributeProvider = new IgnoreAllAttributesProvider(); 
... 

public class IgnoreAllAttributesProvider : IAttributeProvider 
{ 
    public IList<Attribute> GetAttributes(bool inherit) 
    { 
     throw new NotImplementedException(); 
    } 

    public IList<Attribute> GetAttributes(Type attributeType, bool inherit) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Aber der Code wird nie getroffen.

+0

Nicht eine „Lösung“ per se ändern Vertrag, aber man konnte einen Spiegel Modell machen und das serialisiert werden soll. – Eris

Antwort

8

Sie waren auf dem richtigen Weg, Sie haben nur die Serialisierungsoption verpasst.

an folgenden

public class JsonIgnoreAttributeIgnorerContractResolver : DefaultContractResolver 
{ 
    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) 
    { 
     var property = base.CreateProperty(member, memberSerialization); 
     property.Ignored = false; // Here is the magic 
     return property; 
    } 
}