क्या json.net का उपयोग करके किसी json deserialization से एक गतिशील वस्तु को वापस करना संभव है? मैं ऐसा कुछ करना चाहूंगा:
dynamic jsonResponse = JsonConvert.Deserialize(json);
Console.WriteLine(jsonResponse.message);
क्या json.net का उपयोग करके किसी json deserialization से एक गतिशील वस्तु को वापस करना संभव है? मैं ऐसा कुछ करना चाहूंगा:
dynamic jsonResponse = JsonConvert.Deserialize(json);
Console.WriteLine(jsonResponse.message);
जवाबों:
Json.NET हमें ऐसा करने की अनुमति देता है:
dynamic d = JObject.Parse("{number:1000, str:'string', array: [1,2,3,4,5,6]}");
Console.WriteLine(d.number);
Console.WriteLine(d.str);
Console.WriteLine(d.array.Count);
आउटपुट:
1000
string
6
यहां प्रलेखन: LINQ to JSON with Json.NET
JObject.Parse और JArray.Parse भी देखें
JArray.Parse
।
Dim d As Object = JObject.Parse("{number:1000, str:'string', array: [1,2,3,4,5,6]}")
Json.NET 4.0 रिलीज 1 के रूप में, मूल गतिशील समर्थन है:
[Test]
public void DynamicDeserialization()
{
dynamic jsonResponse = JsonConvert.DeserializeObject("{\"message\":\"Hi\"}");
jsonResponse.Works = true;
Console.WriteLine(jsonResponse.message); // Hi
Console.WriteLine(jsonResponse.Works); // True
Console.WriteLine(JsonConvert.SerializeObject(jsonResponse)); // {"message":"Hi","Works":true}
Assert.That(jsonResponse, Is.InstanceOf<dynamic>());
Assert.That(jsonResponse, Is.TypeOf<JObject>());
}
और, ज़ाहिर है, वर्तमान संस्करण प्राप्त करने का सबसे अच्छा तरीका NuGet है।
टिप्पणी को संबोधित करने के लिए अद्यतन (11/12/2014):
यह पूरी तरह से ठीक काम करता है। यदि आप डिबगर में प्रकार का निरीक्षण करते हैं, तो आप देखेंगे कि मूल्य वास्तव में, गतिशील है । अंतर्निहित प्रकार एक है JObject
। यदि आप प्रकार को नियंत्रित करना चाहते हैं (जैसे निर्दिष्ट करना ExpandoObject
, तो ऐसा करें।
@Model.Prop
अगर वापसी प्रकार JValue है तो मैं रेज़र में नाम का उपयोग नहीं कर सकता ।
JValue
। जिसने मुझे भ्रमित कर दिया क्योंकि मैं डिबगर / तत्काल विंडो में काम कर रहा था और बस string
एस नहीं देख रहा था । डेविड इसे नीचे स्क्रीनशॉट में दिखाता है। JValue
परिवर्तनीय है, इसलिए आप बस कर सकते हैंstring m = jsonResponse.message
यदि आप डायनेमिक के लिए बस डिस्क्राइब करते हैं तो आपको एक जेजबजेक्ट वापस मिल जाएगा। आप एक ExpandoObject का उपयोग करके जो चाहें प्राप्त कर सकते हैं।
var converter = new ExpandoObjectConverter();
dynamic message = JsonConvert.DeserializeObject<ExpandoObject>(jsonString, converter);
मुझे पता है कि यह पुरानी पोस्ट है लेकिन JsonConvert का वास्तव में एक अलग तरीका है इसलिए यह होगा
var product = new { Name = "", Price = 0 };
var jsonResponse = JsonConvert.DeserializeAnonymousType(json, product);
हाँ आप इसे JsonConvert.DeserializeObject का उपयोग करके कर सकते हैं। ऐसा करने के लिए, बस सरल करना है:
dynamic jsonResponse = JsonConvert.DeserializeObject(json);
Console.WriteLine(jsonResponse["message"]);
JsonConvert
एक विधि कहा जाता है शामिल नहीं है Deserialize
।
नोट: जिस समय मैंने 2010 में इस प्रश्न का उत्तर दिया था, उस समय बिना किसी प्रकार के डिस्क्राइब करने का कोई तरीका नहीं था, इसने आपको वास्तविक वर्ग को परिभाषित किए बिना डीरिएराइज करने की अनुमति दी और एक अनाम वर्ग को डिसेरिएलाइजेशन करने की अनुमति दी।
आपको डीसर्लाइज़ करने के लिए कुछ प्रकार की आवश्यकता है। आप की तर्ज पर कुछ कर सकते हैं:
var product = new { Name = "", Price = 0 };
dynamic jsonResponse = JsonConvert.Deserialize(json, product.GetType());
मेरा उत्तर JSON धारावाहिक में .NET 4.0 के निर्माण के लिए एक समाधान पर आधारित है। अनाम प्रकारों के deserialize के लिए लिंक यहाँ है:
यदि आप पुराने संस्करण के साथ JSON.NET का उपयोग करते हैं, जो JObject नहीं था।
JSON से डायनामिक ऑब्जेक्ट बनाने का यह एक और सरल तरीका है: https://github.com/chsword/jdynamic
NuGet इंस्टॉल करें
PM> Install-Package JDynamic
सदस्य तक पहुंचने के लिए स्ट्रिंग इंडेक्स का उपयोग करना जैसे:
dynamic json = new JDynamic("{a:{a:1}}");
Assert.AreEqual(1, json["a"]["a"]);
परीक्षण का मामला
और आप इस उपयोग को निम्नानुसार कर सकते हैं:
सीधे मूल्य प्राप्त करें
dynamic json = new JDynamic("1");
//json.Value
2. सदस्य को json ऑब्जेक्ट में रखें
dynamic json = new JDynamic("{a:'abc'}");
//json.a is a string "abc"
dynamic json = new JDynamic("{a:3.1416}");
//json.a is 3.1416m
dynamic json = new JDynamic("{a:1}");
//json.a is integer: 1
3.IEnumerable
dynamic json = new JDynamic("[1,2,3]");
/json.Length/json.Count is 3
//And you can use json[0]/ json[2] to get the elements
dynamic json = new JDynamic("{a:[1,2,3]}");
//json.a.Length /json.a.Count is 3.
//And you can use json.a[0]/ json.a[2] to get the elements
dynamic json = new JDynamic("[{b:1},{c:1}]");
//json.Length/json.Count is 2.
//And you can use the json[0].b/json[1].c to get the num.
अन्य
dynamic json = new JDynamic("{a:{a:1} }");
//json.a.a is 1.
हाँ यह संभव है। मैं हर समय ऐसा करता रहा हूं।
dynamic Obj = JsonConvert.DeserializeObject(<your json string>);
यह गैर देशी प्रकार के लिए थोड़ा मुश्किल है। मान लीजिए कि आपके ओब्ज के अंदर एक क्लासए और क्लासबी ऑब्जेक्ट्स हैं। वे सभी जोबजेक्ट में परिवर्तित हो गए हैं। आपको क्या करने की आवश्यकता है:
ClassA ObjA = Obj.ObjA.ToObject<ClassA>();
ClassB ObjB = Obj.ObjB.ToObject<ClassB>();