2013-02-26 21 views
13

के साथ जॉबजेक्ट और कैमलकेस रूपांतरण मैं जेनेरिक जॉब्जेक्ट को ऊंट कैस साइड जेसन स्ट्रिंग में कैसे परिवर्तित कर सकता हूं? मैं JsonSerializerSettings साथ की कोशिश की है, लेकिन काम नहीं करता है (Newtonsoft.Json 4.5.11)JSON.Net

[Test] 
public void should_convert_to_camel_case() 
{ 
    var serializer = JsonSerializer.Create(new JsonSerializerSettings() 
    { 
     ContractResolver = new CamelCasePropertyNamesContractResolver() 
    }); 

    var jo = new JObject(); 
    jo["CamelCase"] = 1; 

    var stringWriter = new StringWriter(); 
    var writer = new JsonTextWriter(stringWriter); 
    serializer.Serialize(writer,jo); 

    var serialized = stringWriter.ToString(); 

    Assert.AreEqual("{\"camelCase\":1}", serialized); 
} 

अद्यतन http://json.codeplex.com/workitem/23853 कि (लिंक के लिए @nick_w को tnx)

उत्तर

6
नहीं किया जा सकता के अनुसार

this के अनुसार, JObject को क्रमबद्ध करते समय इस तरह अनुबंध समाधान को अनदेखा किया जाता है। उस पृष्ठ पर वैकल्पिक हल से प्रेरित होकर, आप कुछ इस तरह कर सकता है:

var jo = new JObject(); 
jo["CamelCase"] = 1; 

string json = JsonConvert.SerializeObject(jo); 
var jObject = JsonConvert.DeserializeObject<ExpandoObject>(json); 

var settings = new JsonSerializerSettings() 
{ 
    ContractResolver = new CamelCasePropertyNamesContractResolver() 
}; 

var serialized = JsonConvert.SerializeObject(jObject, settings); 

Assert.AreEqual("{\"camelCase\":1}", serialized); 

संपादित करें:

Dictionary<string, object> के बारे में अच्छी बात। तो ऐसा करने से यह अतिरिक्त JsonConvert.SerializeObject छोड़ देता है, लेकिन यह ExpandoObject की आवश्यकता को भी कम करता है, जो महत्वपूर्ण है यदि आप .NET 3.5 का उपयोग कर रहे हैं।

Dictionary<string, object> jo = new Dictionary<string, object>(); 
jo.Add("CamelCase", 1); 

var settings = new JsonSerializerSettings() 
{ 
    ContractResolver = new CamelCasePropertyNamesContractResolver() 
}; 

var serialized = JsonConvert.SerializeObject(jo, settings); 

Assert.AreEqual("{\"camelCase\":1}", serialized); 
+1

लगता है कि धारावाहिक + deserialize + serialize बहुत कुशल है। –

+1

एक वर्कअराउंड के रूप में मैंने जॉब्जेक्ट डू डिक्शनरी <स्ट्रिंग, ऑब्जेक्ट> से स्विच किया है। –

+0

@AndreaBalducci मेरा संपादन देखें। –

20

यह सवाल एक JObject से शुरू होता है और एक ऊंट मामलों JSON ऑब्जेक्ट के लिए काम करना चाहता है। आप वास्तव में एक वस्तु से शुरू करने और एक JObject कि पहले से ही camelcased है करने के लिए प्राप्त करना चाहते हैं कर रहे हैं, तो आप ऐसा कर सकते हैं:

var serializer = new JsonSerializer() 
{ 
    ContractResolver = new CamelCasePropertyNamesContractResolver() 
}; 
var jo = JObject.FromObject(someDataContract, serializer); 

जिसके परिणामस्वरूप 'जो' camelcased कर दिया जाएगा।

+1

यह स्वीकार्य उत्तर होना चाहिए। – ssougnez

+0

मैं विपरीत कैसे कर सकता हूं: 'जॉबजेक्ट.लोड (जेसन रीडर)' रिज़ॉल्वर निर्दिष्ट करके? – Shimmy

3

this मई 8, 2013 जेम्स न्यूटन-किंग द्वारा जेसन.नेट की 5.0 रिलीज के संबंध में ब्लॉग पोस्ट, इसे "डिफ़ॉल्ट सेटिंग्स" के अतिरिक्त संबोधित किया गया है। उस पृष्ठ का उदाहरण निम्नानुसार है लेकिन तृतीय पक्ष पुस्तकालयों के विवरण के लिए पृष्ठ पढ़ें।

// settings will automatically be used by JsonConvert.SerializeObject/DeserializeObject 
JsonConvert.DefaultSettings =() => new JsonSerializerSettings 
    { 
    Formatting = Formatting.Indented, 
    ContractResolver = new CamelCasePropertyNamesContractResolver() 
    }; 

Employee e = new Employee 
    { 
    FirstName = "Eric", 
    LastName = "Example", 
    BirthDate = new DateTime(1980, 4, 20, 0, 0, 0, DateTimeKind.Utc), 
    Department = "IT", 
    JobTitle = "Web Dude" 
    }; 

string json = JsonConvert.SerializeObject(e); 
// { 
// "firstName": "Eric", 
// "lastName": "Example", 
// "birthDate": "1980-04-20T00:00:00Z", 
// "department": "IT", 
// "jobTitle": "Web Dude" 
// }