c# serialization json.net

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



serialization (3)

Tengo algunos datos en un objeto C # DataSet. Puedo serializarlo ahora mismo 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 utiliza los nombres de propiedades de los data al imprimir en el archivo .json. Me gustaría cambiar los nombres de las propiedades para que sean algo diferentes (por ejemplo, cambiar ''foo'' a ''bar'').

En la documentación de Json.net , en ''Serialización y deserialización de JSON'' → ''Atributos de serialización'', dice "JsonPropertyAttribute ... permite que el nombre se personalice". Pero no hay ejemplo. ¿Alguien sabe cómo usar un atributo 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 gran ejemplo, intentaré agregarlo a la documentación oficial. ¡Gracias!


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

using Newtonsoft.Json; // ... [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 si no desea usar siempre la misma propiedad de cambio de nombre, también puede hacer un cambio de nombre creando 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 a la serialización y suministre al resolutor.

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 resoluciones personalizadas here


Todavía hay otra forma de hacerlo, que es usar una NamingStrategy particular, que se puede aplicar a una clase o propiedad al decorarlos con [JSonObject] o [JsonProperty] .

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