Como posso alterar nomes de propriedades ao serializar com o Json.net?

Eu tenho alguns dados em um object C # DataSet. Eu posso serializá-lo agora usando um conversor Json.net como este

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

No entanto, isso usa os nomes de propriedade dos data ao imprimir no arquivo .json. Eu gostaria de mudar os nomes das propriedades para algo diferente (digamos, mude ‘foo’ para ‘bar’).

Na documentação do Json.net , em ‘Serializando e desserializando o JSON’ → ‘Atributos de serialização‘, ele diz que “JsonPropertyAttribute … permite que o nome seja personalizado”. Mas não há exemplo. Alguém sabe como usar um JsonPropertyAttribute para alterar o nome da propriedade para outra coisa?

( Link direto para documentação )

A documentação do Json.net parece ser escassa. Se você tiver um ótimo exemplo, tentarei adicioná-lo à documentação oficial. Obrigado!

Você pode decorar a propriedade que deseja controlar seu nome com o atributo [JsonProperty] que permite especificar um nome diferente:

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

Documentação: Atributos de Serialização

Se você não tiver access às classs para alterar as propriedades ou não quiser sempre usar a mesma propriedade de renomeação, a renomeação também poderá ser feita criando um resolvedor personalizado.

Por exemplo, se você tem uma class chamada MyCustomObject , que tem uma propriedade chamada LongPropertyName , você pode usar um resolvedor personalizado como este …

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

Em seguida, ligue para serialização e forneça o resolvedor

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

E o resultado será encurtado para {“Short”: “prop value”} ao invés de {“LongPropertyName”: “prop value”}

Mais informações sobre resolvedores personalizados aqui

Há ainda outra maneira de fazer isso, que é usar uma NamingStrategy específica, que pode ser aplicada a uma class ou uma propriedade, decorando-as com [JSonObject] ou [JsonProperty] .

Existem estratégias de nomeação predefinidas, como CamelCaseNamingStrategy , mas você pode implementar as suas próprias.