2012-10-05 5 views
15

मैं अपनी वेबसाइट के लिए जेसन.Net का उपयोग कर रहा हूं। मैं serializer डिफ़ॉल्ट रूप से camelcase में संपत्ति के नाम serialize करना चाहता हूँ। मैं नहीं चाहता कि यह उन संपत्ति नामों को बदल दे जो मैं मैन्युअल रूप से असाइन करता हूं। मैं निम्नलिखित कोड है:केवल CamelCase अगर प्रॉपर्टीनाम स्पष्ट रूप से 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); 
} 

Experiment से उत्पादन होता है:

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

हालांकि, मैं उत्पादन होना चाहते हैं:

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

इस लक्ष्य को हासिल करना संभव है?

+0

'CamelCasePropertyNamesContractResolver' का उपयोग करें और केवल का उपयोग' JsonProperty' नहीं है। –

+0

@ एल.बी. यदि मैं केवल जेसनप्रोपर्टी का उपयोग करता हूं, तो डिफ़ॉल्ट नामकरण पास्कलकेस होगा, इसलिए JSON में 'सामान्य प्रॉपर्टी' '' सामान्य प्रॉपर्टी 'होगी। – Oliver

+0

ओलिवर नो, यह जेसनप्रोपर्टी में जो कुछ भी देता है, वैसे ही इसे क्रमबद्ध किया जाता है। –

उत्तर

18

आप इस तरह CamelCasePropertyNamesContractResolver वर्ग ओवरराइड कर सकते हैं:

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

एक मामूली सुधार 'अगर (res.PropertyName! = Null && attr.PropertyName! = Null) 'ऐसा करने से आप बिना किसी नाम के फ़ील्ड पर' जेसनप्रोपर्टी 'विशेषता सेट कर सकते हैं और फिर भी इसे नियमित ऊंट के आवरण से संभाला जा सकता है। उपयोगी अगर आप कुछ ऐसा करना चाहते हैं जैसे '[जेसनप्रोपर्टी (नलवैल्यू हैंडलिंग = नलवैल्यू हैंडलिंग.इग्नोर)] ' –

संबंधित मुद्दे