530 Stimmen

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 folgt serialisieren

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

Dabei werden jedoch die Eigenschaftsnamen aus data beim Drucken in die .json-Datei. Ich möchte die Eigenschaftsnamen ändern, um etwas anderes zu sein (sagen wir, ändern Sie "foo" zu "bar").

En el Json.net-Dokumentation Unter "Serialisieren und Deserialisieren von JSON" "Serialisierungsattribute" heißt es "JsonPropertyAttribute... ermöglicht die Anpassung des Namens". Aber es gibt kein Beispiel. Weiß jemand, wie man ein JsonPropertyAttribute verwenden, um den Namen der Eigenschaft in etwas anderes zu ändern?

( Direkter Link zur Dokumentation )

Die Dokumentation von Json.net scheint spärlich zu sein. Wenn Sie ein gutes Beispiel haben, werde ich versuchen, es in die offizielle Dokumentation aufzunehmen. Danke!

936voto

Darin Dimitrov Punkte 990883

Sie können die gewünschte Eigenschaft, die ihren Namen steuert, mit der Option [JsonProperty] Attribut, mit dem Sie einen anderen Namen angeben können:

using Newtonsoft.Json;
// ...

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

Dokumentation: Serialisierungsattribute

107voto

StingyJack Punkte 18514

Wenn Sie keinen Zugriff auf die Klassen haben, um die Eigenschaften zu ändern, oder nicht immer dieselbe Eigenschaft "Umbenennen" verwenden wollen, können Sie die Umbenennung auch durch die Erstellung eines benutzerdefinierten Resolvers vornehmen.

Wenn Sie zum Beispiel eine Klasse namens MyCustomObject die eine Eigenschaft namens LongPropertyName 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 geben Sie den Resolver an:

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

Und das Ergebnis wird verkürzt auf {"Short": "prop value"} 代わりに {"LongPropertyName": "Requisitenwert"}

Weitere Informationen über benutzerdefinierte Resolver aquí

9voto

JotaBe Punkte 36281

Es gibt noch eine andere Möglichkeit, nämlich die Verwendung eines bestimmten NamingStrategy die auf eine Klasse oder eine Eigenschaft angewendet werden können, indem man sie mit [JSonObject] o [JsonProperty] .

Es gibt vordefinierte Benennungsstrategien wie CamelCaseNamingStrategy aber Sie können Ihre eigenen einführen.

Die Umsetzung der verschiedenen Benennungsstrategien finden Sie hier: https://github.com/JamesNK/Newtonsoft.Json/tree/master/Src/Newtonsoft.Json/Serialization

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X