यह वह जगह है बहुत कमजोर क्योंकि आपको वापस एक स्ट्रिंग में परिवर्तित करना है, लेकिन यदि आप कुछ त्वरित और गंदे कर रहे हैं, जहां प्रदर्शन हिट कोई फर्क नहीं पड़ता है, तो मैं नीचे दी गई विधि का उपयोग करता हूं। मुझे यह पसंद है क्योंकि मुझे जेसन/जॉब्जेक्ट और मेरे पॉको के बीच संपत्तियों को मैप करने के लिए कोई कोड लिखना नहीं है।
public static class JsonExtensions {
public static T As<T>(this JObject jobj) {
return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(jobj));
}
public static List<T> ToList<T>(this JArray jarray) {
return JsonConvert.DeserializeObject<List<T>>(JsonConvert.SerializeObject(jarray));
}
}
[Test]
public void TestDeserializeRootObject() {
var json = @"{ id: 1, name: ""Dwight"" }";
var jfoo = JsonConvert.DeserializeObject(json);
var foo = (jfoo as JObject).As<Foo>();
Assert.AreEqual(1, foo.Id);
Assert.AreEqual("Dwight", foo.Name);
}
[Test]
public void TestDeserializeArray() {
var json = @"[
{ id: 1, name: ""Dwight"" }
, { id: 2, name: ""Pam"" }
]";
var foosArr = JsonConvert.DeserializeObject(json);
Assert.IsInstanceOf<JArray>(foosArr);
Assert.AreEqual(2, (foosArr as JArray).Count);
var foos = (foosArr as JArray).ToList<Foo>();
Assert.AreEqual(2, foos.Count);
var foosDict = foos.ToDictionary(f => f.Name, f => f);
Assert.IsTrue(foosDict.ContainsKey("Dwight"));
var dwight = foosDict["Dwight"];
Assert.AreEqual(1, dwight.Id);
Assert.AreEqual("Dwight", dwight.Name);
Assert.IsTrue(foosDict.ContainsKey("Pam"));
var pam = foosDict["Pam"];
Assert.AreEqual(2, pam.Id);
Assert.AreEqual("Pam", pam.Name);
}
स्रोत
2013-03-15 19:34:10
मैं इस विधि को पसंद करता हूं। यह संक्षिप्त और अधिक सुरुचिपूर्ण है। – Mahmoodvcs
मुझे लगता है कि मैं भी यह जवाब पसंद करता हूं। मैं कभी-कभी LINQ को अनदेखा करता हूं। – moswald
कास्टिंग से बचना भी संभव है: myJArray.Select (jv => jv.Value())। ToArray(); –
mikebridge