Comment puis-je changer les noms de propriétés lors de la sérialisation avec Json.net Je ne sais pas.

j'ai quelques données dans un objet C# DataSet. Je peux le sérialiser maintenant en utilisant un Json.net convertisseur comme ceci

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

cependant, cela utilise les noms de propriété de data lors de l'impression à la .fichier json. Je voudrais changer les noms des propriétés pour être quelque chose de différent (par exemple, changer 'foo' en 'bar').

dans le Json.net documentation , sous "Serializing and Deserializing JSON" → " Serialization Attributs 'il est dit" JsonPropertyAttribute... permet d'indiquer le nom à être personnalisés". 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é à quelque chose d'autre?

( lien Direct vers la documentation )

Json.net la documentation semble être clairsemée. Si vous avez un très bon exemple, je vais essayer d'ajouter à la documentation officielle. Merci!

302
demandé sur Uwe Keim 2012-01-10 03:24:07

3 réponses

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

using Newtonsoft.Json;
// ...

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

Documentation: Attributs De Sérialisation

587
répondu Darin Dimitrov 2018-09-25 15:37:01

si vous n'avez pas accès aux classes pour changer les propriétés, ou si vous ne voulez pas toujours utiliser la même propriété de renommage, renommer peut aussi être fait 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 ça...

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

puis appeler pour la sérialisation et fournir le résolveur

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

et le résultat sera réduite à {"Court":"prop valeur"} au lieu de {"LongPropertyName":"prop valeur"}

plus d'informations sur les résolveurs sur mesure ici

52
répondu StingyJack 2015-10-22 21:03:28

il y a encore une autre façon de le faire, qui est d'utiliser un particulier 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 nommage prédéfinies comme CamelCaseNamingStrategy , mais vous pouvez implémenter vos propres stratégies.

2
répondu JotaBe 2018-05-11 08:22:25