2012-01-09 36 views
254

Tengo algunos datos en un objeto C# DataSet. Puedo serializarlo en este momento utilizando un convertidor Json.net como esto¿Cómo puedo cambiar los nombres de propiedad al serializar con Json.net?

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

Sin embargo, este utiliza los nombres de las propiedades de data al imprimir el archivo .json. Me gustaría cambiar los nombres de las propiedades para que sean diferentes (por ejemplo, cambiar 'foo' por 'bar').

En el Json.net documentation, 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?

(Direct link to documentation)

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

+3

FYI, hay un ejemplo de esto en la documentación en [Muestras -> Serialización de JSON -> Nombre de atributo de JsonProperty] (http://james.newtonking.com/json/help/?topic=html/JsonPropertyName.htm) . No estoy seguro en qué punto fue agregado. –

Respuesta

477

Usted 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: Serialization Attributes

+1

¿Esto requiere que lea mis datos en un objeto personalizado que creo en lugar de un DataSet? – culix

+3

@culix, sí, requiere el uso de un modelo. Un DataSet es una estructura débilmente tipada, por lo que hablar sobre los nombres de propiedad no es muy lógico. –

+31

Como una abreviatura, también puede hacer '[JsonProperty (" FooBar ")]' –

41

Si usted no tiene acceso a la para cambiar las propiedades, o no desea 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 usted tiene una clase llamada MyCustomObject, que tiene una propiedad llamada LongPropertyName, se puede utilizar 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; 
    } 
} 

A continuación, llame para la serialización y suministrar el sistema de resolución

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

Y el resultado será acortada a { "corto": "propuestas de valor"} en lugar de { "LongPropertyName": "propuestas de valor"}

Más información en resolutores personalizados here

+0

Esta es una mejor solución si su clase para serializar se declara en otro ensamblado que incluye una versión diferente del paquete Newtonsoft.Json. (Puede que incluso no arroje ningún error). El 'DefaultContractResolver' se debe colocar en el mismo ensamblado donde se usa el método JsonConvert.Serialize(). – Artemious

0

Todavía hay otra manera de hacerlo, que está utilizando un determinado NamingStrategy, que se puede aplicar a una clase o una propiedad mediante la decoración con [JSonObject] o [JsonProperty].

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

Cuestiones relacionadas