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

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

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

Toutefois, cela utilise les noms de propriété des 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, changez “toto” en “barre”).

Dans la documentation de Json.net , sous “Serializing and Deserializing JSON” → “Atsortingbuts de sérialisation“, il est dit “JsonPropertyAtsortingbute … permet de personnaliser le nom”. Mais il n’y a pas d’exemple. Est-ce que quelqu’un sait comment utiliser un JsonPropertyAtsortingbute 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’append à la documentation officielle. Merci!

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

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

Documentation: Atsortingbuts de sérialisation

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

Par exemple, si vous avez une classe appelée MyCustomObject , qui possède 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", SsortingngComparison.OrdinalIgnoreCase)) { property.PropertyName = "Short"; } } return property; } } 

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

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

Et le résultat sera raccourci en {“Short”: “prop value”} au lieu de {“LongPropertyName”: “prop value”}

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

Il y a encore une autre façon de le faire, qui utilise une NamingStrategy particulière, qui peut être appliquée à 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.