2012-10-05 11 views
15

Ich benutze Json.Net für meine Website. Ich möchte, dass der Serializer Eigenschaftsnamen in Camelcase standardmäßig serialisiert. Ich möchte nicht, dass Eigenschaftsnamen, die ich manuell zugewiesen habe, geändert werden. Ich habe den folgenden Code:CamelCase nur wenn PropertyName nicht explizit in Json.Net gesetzt?

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

Die Ausgabe von Experiment ist:

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

Allerdings möchte ich die Ausgabe sein:

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

Ist das möglich zu erreichen?

+0

nicht verwenden 'CamelCasePropertyNamesContractResolver' und verwenden' JsonProperty' nur. –

+0

@ L.B Wenn ich nur JsonProperty benutze, ist die Standardbenennung PascalCase, also wird 'normalProperty' stattdessen' NormalProperty' im JSON. – Oliver

+0

Oliver Nein, es ist genau wie das, was Sie in JsonProperty geben, serialisiert. –

Antwort

18

können Sie überschreiben die CamelCasePropertyNamesContractResolver Klasse wie folgt:

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

Eine leichte Verbesserung 'if (res.PropertyName! = Null && attr.PropertyName! = Null)' Dadurch können Sie ein 'JsonProperty' Attribut für ein Feld ohne Namen setzen und es trotzdem mit regulärem camel casing behandeln. Nützlich, wenn Sie nur etwas wie '[JsonProperty (NullValueHandling = NullValueHandling.Ignore)]' setzen möchten –

Verwandte Themen