¿Cómo puedo cambiar los nombres de propiedad al serializar con Json.net?

Tengo algunos datos en un objeto C # DataSet. Puedo serializarlo ahora usando un convertidor Json.net como este

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

Sin embargo, esto usa los nombres de propiedad de los data al imprimir en el archivo .json. Me gustaría cambiar los nombres de las propiedades para que sean diferentes (por ejemplo, cambiar ‘foo’ por ‘bar’).

En la documentación de Json.net , en ‘Serializar y deserializar JSON’ → ‘Atributos de serialización‘, dice “JsonPropertyAttribute … permite personalizar el nombre”. Pero no hay ningún ejemplo. ¿Alguien sabe cómo usar un JsonPropertyAttribute para cambiar el nombre de la propiedad a otra cosa?

( Enlace directo a la documentación )

La documentación de Json.net parece ser escasa. Si tiene un buen ejemplo, intentaré que se agregue a la documentación oficial. ¡Gracias!

Puede decorar la propiedad que desea controlar su nombre con el atributo [JsonProperty] que le permite especificar un nombre diferente:

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

Documentación: Atributos de serialización

Si no tiene acceso a las clases para cambiar las propiedades, o no quiere usar siempre la misma propiedad de cambio de nombre, el cambio de nombre también se puede hacer mediante la creación de una resolución personalizada.

Por ejemplo, si tiene una clase llamada MyCustomObject , que tiene una propiedad llamada LongPropertyName , puede usar una resolución personalizada como esta …

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

Luego llame para la serialización y proporcione el resolver

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

Y el resultado se reducirá a {“Short”: “prop value”} en lugar de {“LongPropertyName”: “prop value”}

Más información sobre resolución personalizada aquí

Todavía hay otra forma de hacerlo, que es el uso de una NamingStrategy particular, que se puede aplicar a una clase o una propiedad decorándolas con [JSonObject] o [JsonProperty] .

Existen estrategias de nombres predefinidas como CamelCaseNamingStrategy , pero puede implementar las suyas propias.