2012-10-05 21 views
15

Estoy usando Json.Net para mi sitio web. Quiero que el serializador serialice los nombres de las propiedades en camelcase de forma predeterminada. No quiero que cambie los nombres de propiedad que asigné manualmente. Tengo el siguiente código:CamelCase solo si PropertyName no se establece explícitamente en Json.Net?

public class TestClass 
{ 
    public string NormalProperty { get; set; } 

    [JsonProperty(PropertyName = "CustomName")] 
    public string ConfiguredProperty { get; set; } 
} 

public void Experiment() 
{ 
    var data = new TestClass { NormalProperty = null, 
     ConfiguredProperty = null }; 

    var result = JsonConvert.SerializeObject(data, 
     Formatting.None, 
     new JsonSerializerSettings {ContractResolver 
      = new CamelCasePropertyNamesContractResolver()} 
     ); 
    Console.Write(result); 
} 

La salida de Experiment es:

{"normalProperty":null,"customName":null} 

Sin embargo, quiero que la salida sea:

{"normalProperty":null,"CustomName":null} 

Es esto posible lograr?

+0

no usar '' CamelCasePropertyNamesContractResolver' y utilizar JsonProperty' solamente. –

+0

@ L.B Si solo uso JsonProperty, el nombre predeterminado será PascalCase, por lo que 'normalProperty' será' NormalProperty' en el JSON. – Oliver

+0

Oliver No, se serializa exactamente como lo que das en JsonProperty. –

Respuesta

18

Usted puede sustituir la clase de CamelCasePropertyNamesContractResolver así:

class CamelCase : CamelCasePropertyNamesContractResolver 
{ 
    protected override JsonProperty CreateProperty(MemberInfo member, 
     MemberSerialization memberSerialization) 
    { 
     var res = base.CreateProperty(member, memberSerialization); 

     var attrs = member 
      .GetCustomAttributes(typeof(JsonPropertyAttribute),true); 
     if (attrs.Any()) 
     { 
      var attr = (attrs[0] as JsonPropertyAttribute); 
      if (res.PropertyName != null) 
       res.PropertyName = attr.PropertyName; 
     } 

     return res; 
    } 
} 
+8

Una ligera mejora 'if (res.PropertyName! = Null && attr.PropertyName! = Null)' Hacer esto le permite establecer un atributo 'JsonProperty' en un campo sin nombre y aún así tenerlo manejado con una cubierta normal de camello. Útil si solo quiere configurar algo como '[JsonProperty (NullValueHandling = NullValueHandling.Ignore)]' –

Cuestiones relacionadas