[C#] Eine Eigenschaft deserialisieren, aber nicht mit json.net serialisieren


Answers

Ich mag es, mit Attributen zu bleiben, hier ist die Methode, die ich benutze, wenn ich eine Eigenschaft deserialisieren, aber nicht serialisieren muss oder umgekehrt.

SCHRITT 1 - Erstellen Sie das benutzerdefinierte Attribut

public class JsonIgnoreSerializationAttribute : Attribute { }

SCHRITT 2 - Erstellen Sie einen benutzerdefinierten Contract Reslover

class JsonPropertiesResolver : DefaultContractResolver
{
    protected override List<MemberInfo> GetSerializableMembers(Type objectType)
    {
        //Return properties that do NOT have the JsonIgnoreSerializationAttribute
        return objectType.GetProperties()
                         .Where(pi => !Attribute.IsDefined(pi, typeof(JsonIgnoreSerializationAttribute)))
                         .ToList<MemberInfo>();
    }
}

SCHRITT 3 - Attribut hinzufügen, wenn Serialisierung nicht benötigt wird, aber Deserialisierung ist

    [JsonIgnoreSerialization]
    public string Prop1 { get; set; } //Will be skipped when serialized

    [JsonIgnoreSerialization]
    public string Prop2 { get; set; } //Also will be skipped when serialized

    public string Prop3 { get; set; } //Will not be skipped when serialized

SCHRITT 4 - Benutze es

var sweet = JsonConvert.SerializeObject(myObj, new JsonSerializerSettings { ContractResolver = new JsonPropertiesResolver() });

Hoffe das hilft! Es ist auch erwähnenswert, dass dies auch die Eigenschaften ignoriert, wenn die Deserialisierung stattfindet. Wenn ich das Deserialisieren verwende, benutze ich einfach den Konverter auf die herkömmliche Weise.

JsonConvert.DeserializeObject<MyType>(myString);
Question

Wir haben einige Konfigurationsdateien, die durch das Serialisieren von C # -Objekten mit Json.net generiert wurden.

Wir möchten eine Eigenschaft der serialisierten Klasse von einer einfachen enum-Eigenschaft in eine Klasseneigenschaft migrieren.

Ein einfacher Weg, dies zu tun, wäre, die alte enum-Eigenschaft der Klasse zu belassen und dafür zu sorgen, dass Json.net diese Eigenschaft liest, wenn wir die Konfiguration laden, aber nicht, um sie beim nächsten Serialisieren des Objekts erneut zu speichern. Wir werden uns darum kümmern, die neue Klasse aus dem alten Enum separat zu generieren.

Gibt es eine einfache Möglichkeit, eine Eigenschaft eines C # -Objekts (zB mit Attributen) zu markieren, so dass Json.net es NUR bei der Serialisierung ignoriert, aber beim Deserialisieren darauf achtet?




Für jede Situation, in der es akzeptabel ist, dass Ihre Deserialisierungseigenschaft intern markiert ist, gibt es eine bemerkenswert einfache Lösung, die überhaupt nicht von Attributen abhängt. Markieren Sie die Eigenschaft einfach als internal get, aber public set:

public class JsonTest {

    public string SomeProperty { internal get; set; }

}

Dies führt zu einer korrekten Deserialisierung unter Verwendung von Standardeinstellungen / Resolvern / etc. Die Eigenschaft wird jedoch von der serialisierten Ausgabe entfernt.




Setze Setzereigenschaft:

[JsonProperty(nameof(IgnoreOnSerializing))]
public string IgnoreOnSerializingSetter { set { _ignoreOnSerializing = value; } }

[JsonIgnore]
private string _ignoreOnSerializing;

[JsonIgnore]
public string IgnoreOnSerializing
{
    get { return this._ignoreOnSerializing; }
    set { this._ignoreOnSerializing = value; }
}

Ich hoffe das hilft.