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


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

En el Json.net documentation , bajo 'Serialización y Deserialización de JSON' → 'Atributos de serialización' dice "JsonPropertyAttribute... permite que el nombre sea personalizar". Pero no hay ejemplo. ¿Alguien sabe cómo usar un JsonPropertyAttribute para cambiar el nombre de la propiedad a otra cosa?

(enlace Directo a la documentación)

Json.net ' s documentación parece ser escasa. Si tienes un gran ejemplo, intentaré agregarlo a la documentación oficial. ¡Gracias!

Author: Uwe Keim, 2012-01-10

3 answers

Puede decorar la propiedad que desea controlar 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

 587
Author: Darin Dimitrov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-25 15:37:01

Si no tiene acceso a las clases para cambiar las propiedades, o no desea usar siempre la misma propiedad rename, el cambio de nombre también se puede hacer creando un solucionador personalizado.

Por ejemplo, si tiene una clase llamada MyCustomObject, que tiene una propiedad llamada LongPropertyName, puede usar un solucionador 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;
  }
}

Luego llame a serialización y proporcione el solucionador

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

Y el resultado se acortará a {"Short":"prop value"} en lugar de {"LongPropertyName": "valor de prop"}

Más información sobre resolvers personalizados aquí

 52
Author: StingyJack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-22 21:03:28

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

Existen estrategias de nomenclatura predefinidas como CamelCaseNamingStrategy, pero puedes implementar las tuyas propias.

 2
Author: JotaBe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-11 08:22:25