web-dev-qa-db-fra.com

Comment puis-je modifier les noms de propriétés lors de la sérialisation avec Json.net?

J'ai des données dans un objet DataSet C #. Je peux le sérialiser maintenant en utilisant un convertisseur Json.net comme celui-ci

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

Toutefois, cela utilise les noms de propriété de data lors de l’impression dans le fichier .json. Je voudrais changer les noms de propriété pour être quelque chose de différent (par exemple, changer "foo" à "bar").

Dans la documentation Json.net , sous "Sérialisation et désérialisation JSON" → "Attributs de sérialisation", il est indiqué "JsonPropertyAttribute ... permet de personnaliser le nom". Mais il n'y a pas d'exemple. Est-ce que quelqu'un sait comment utiliser un JsonPropertyAttribute pour changer le nom de la propriété en quelque chose d'autre?

( lien direct vers la documentation )

La documentation de Json.net semble être rare. Si vous avez un bon exemple, je vais essayer de l’ajouter à la documentation officielle. Merci!

393
culix

Vous pouvez décorer la propriété que vous souhaitez contrôler avec son nom avec l'attribut [JsonProperty] qui vous permet de spécifier un nom différent:

using Newtonsoft.Json;
// ...

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

Documentation: attributs de sérialisation

735
Darin Dimitrov

Si vous n'avez pas accès aux classes pour modifier les propriétés, ou si vous ne souhaitez pas toujours utiliser la même propriété de changement de nom, vous pouvez également renommer en créant un résolveur personnalisé.

Par exemple, si vous avez une classe appelée MyCustomObject, qui a une propriété appelée LongPropertyName, vous pouvez utiliser un résolveur personnalisé comme celui-ci…

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;
  }
}

Appelez ensuite la sérialisation et fournissez le résolveur:

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

Et le résultat sera réduit à {"Short": "prop valeur"} au lieu de {"LongPropertyName" : "valeur prop"}

Plus d'informations sur les résolveurs personnalisés ici

67
StingyJack

Il existe encore un autre moyen de le faire, qui utilise un NamingStrategy , qui peut être appliqué à une classe ou à une propriété en les décorant avec [JSonObject] ou [JsonProperty].

Il existe des stratégies de dénomination prédéfinies comme CamelCaseNamingStrategy, mais vous pouvez en implémenter d'autres.

La mise en œuvre de différentes stratégies de dénomination est disponible ici: https://github.com/JamesNK/Newtonsoft.Json/tree/master/Src/Newtonsoft.Json/Serialization

4
JotaBe