it-swarm.com.de

Wie kann ich Eigenschaftsnamen bei der Serialisierung mit Json.net ändern?

Ich habe einige Daten in einem C # DataSet-Objekt. Ich kann es jetzt mit einem Json.net-Konverter wie diesem serialisieren

DataSet data = new DataSet();
// do some work here to populate 'data'
string output = JsonConvert.SerializeObject(data);

Hierbei werden jedoch die Eigenschaftsnamen von data verwendet, wenn in die JSON-Datei gedruckt wird. Ich möchte die Eigenschaftsnamen ändern, um sie zu ändern (z. B. 'foo' in 'bar' ändern).

In der Json.net-Dokumentation wird unter 'Serialisierung und Deserialisierung von JSON' → 'Serialisierungsattribute' die Meldung "JsonPropertyAttribute ... ermöglicht das Anpassen des Namens" angezeigt. Aber es gibt kein Beispiel. Kann jemand ein JsonPropertyAttribute verwenden, um den Eigenschaftsnamen in etwas anderes zu ändern?

( Direkter Link zur Dokumentation )

Die Dokumentation von Json.net scheint spärlich zu sein. Wenn Sie ein großartiges Beispiel haben, werde ich versuchen, es in die offizielle Dokumentation aufzunehmen. Vielen Dank!

393
culix

Sie können die Eigenschaft, deren Namen Sie steuern möchten, mit dem Attribut [JsonProperty] dekorieren, mit dem Sie einen anderen Namen angeben können:

using Newtonsoft.Json;
// ...

[JsonProperty(PropertyName = "FooBar")]
public string Foo { get; set; }

Dokumentation: Serialisierungsattribute

735
Darin Dimitrov

Wenn Sie keinen Zugriff auf die Klassen haben, um die Eigenschaften zu ändern, oder nicht immer dieselbe Umbenennungseigenschaft verwenden möchten, können Sie die Umbenennung auch durch Erstellen eines benutzerdefinierten Auflösers vornehmen.

Wenn Sie beispielsweise eine Klasse mit dem Namen MyCustomObject haben, die eine Eigenschaft mit dem Namen LongPropertyName hat, können Sie einen benutzerdefinierten Resolver wie diesen verwenden.

public class CustomDataContractResolver : DefaultContractResolver
{
  public static readonly CustomDataContractResolver Instance = new CustomDataContractResolver ();

  protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
  {
    var property = base.CreateProperty(member, memberSerialization);
    if (property.DeclaringType == typeof(MyCustomObject))
    {
      if (property.PropertyName.Equals("LongPropertyName", StringComparison.OrdinalIgnoreCase))
      {
        property.PropertyName = "Short";
      }
    }
    return property;
  }
}

Rufen Sie dann zur Serialisierung auf und liefern Sie den Resolver:

 var result = JsonConvert.SerializeObject(myCustomObjectInstance,
                new JsonSerializerSettings { ContractResolver = CustomDataContractResolver.Instance });

Und das Ergebnis wird auf {"Short": "prop value"} anstelle von {"LongPropertyName" gekürzt. : "prop value"}

Weitere Informationen zu benutzerdefinierten Resolvern hier

67
StingyJack

Es gibt noch eine andere Möglichkeit, die ein bestimmtes NamingStrategy verwendet, das auf eine Klasse oder eine Eigenschaft angewendet werden kann, indem sie mit [JSonObject] oder [JsonProperty] dekoriert werden.

Es gibt vordefinierte Namensstrategien wie CamelCaseNamingStrategy, aber Sie können Ihre eigenen implementieren.

Die Implementierung verschiedener Namensstrategien finden Sie hier: https://github.com/JamesNK/Newtonsoft.Json/tree/master/Src/Newtonsoft.Json/Serialization

4
JotaBe