* इस प्रश्न को लिखते/संपादित करते समय, मैंने अपने स्वयं के प्रश्न का उत्तर देना शुरू कर दिया। अधिक जानकारी के लिए पढ़ें लेकिन बोल्ड में, मेरा वास्तविक प्रश्न बहुत अंत में है। धन्यवाद! *जेकॉन्टैनर, जॉब्जेक्ट, जेटोकन और लिंक भ्रम
मुझे JContainer, JObject, और JToken का उपयोग करने में समझ में समस्या आ रही है। मैं "मानकों" से समझता हूं कि जॉब्जेक्ट जेपीप्रर्टीज से बना है और जेटीकेन सभी जेटीकेन प्रकारों के लिए मूल सार श्रेणी है, लेकिन मैं जेकॉन्टैनर को समझ नहीं पा रहा हूं।
मैं सी # का उपयोग कर रहा हूँ और मैं सिर्फ LINQPad प्रो खरीदा 5.
मैं एक फ़ाइल में एक JSON डेटा स्रोत है, इसलिए मुझे लगता है कि फ़ाइल की सामग्री deserializing रहा हूँ सफलतापूर्वक इस कथन का उपयोग:
string json;
using (StreamReader reader = new StreamReader(@"myjsonfile.json"))
{
json = reader.ReadToEnd();
}
उस समय, मैं json स्ट्रिंग वस्तु लेने के लिए और एक JObject को यह deserialize (और यह मेरी गलती हो सकती है - शायद मैं jsonWork एक JToken या JContainer बनाने की जरूरत है?):
JObject jsonWork = (JObject)JsonConvert.DeserializeObject(json);
मेरी JSON में डेटा (स्ट्रिंग json द्वारा प्रतिनिधित्व), मैं तीन वस्तुओं है - उच्च-स्तरीय वस्तु कुछ ऐसा दिखाई:
{
"Object1" : { ... },
"Object2" : { ... },
"Object3" : { ... }
}
प्रत्येक वस्तु टोकन के सभी प्रकार से बना है (सरणियों, तार, अन्य वस्तुओं, आदि ।), तो यह गतिशील JSON है। (मैंने इस सवाल को हल करने के बजाय प्लेसहोल्डर्स के रूप में इलिप्स को इस्तेमाल किया है।)
मैं लिंकक का उपयोग करके अलग-अलग "ऑब्जेक्ट 1", "ऑब्जेक्ट 2" और "ऑब्जेक्ट 3" को संसाधित करना चाहता हूं। तो, आदर्श रूप में, मुझे ऐसा कुछ चाहिए:
// these lines DO NOT work
var jsonObject1 = jsonWork.Children()["Object1"]
var jsonObject2 = jsonWork.Children()["Object2"]
var jsonObject3 = jsonWork.Children()["Object3"]
लेकिन उपरोक्त पंक्तियां विफल हो गईं।
मैंने उपरोक्त "var" का उपयोग किया क्योंकि मुझे नहीं पता कि मुझे किस वस्तु प्रकार का उपयोग करना चाहिए: जेकॉन्टैनर, जॉब्जेक्ट, या जेटोकन! एक बार उपरोक्त jsonObject # चर ठीक से असाइन किए जाने के बाद, मैं जानता हूं कि मैं क्या करना चाहता हूं, मैं जेएनओएन से पूछताछ करने के लिए लिंक का उपयोग करना चाहता हूं।
var query = from p in jsonObject1
where p.Name == "Name1"
select p
बेशक
, मेरे Linq अंततः JSON सरणियों, वस्तुओं, तार, आदि के लिए फिल्टर करेगा, JSONObject चर में ... मुझे लगता है कि एक बार मैं जा रहा हो, मैं उपयोग कर सकते हैं: यहाँ एक बहुत ही सरल उदाहरण है लिंककैड का उपयोग करके जेएसओएन को फ़िल्टर करने में मेरी मदद करने के लिए लिंक (मुझे अधिक अनुवर्ती प्रश्न हो सकते हैं, हालांकि, और मैं उन्हें इस साइट पर पोस्ट करूंगा) ...
कोई विचार?
****** जोड़ा गया विवरण: ठीक है, मुझे पता चला है कि अगर मैं का उपयोग करें:
// this line WORKS
var jsonObject1 = ((JObject)jsonWork).["Object1"];
तब मैं jsonObject1 में एक JObject प्रकार मिलता है। क्या यह सही दृष्टिकोण है?
प्रश्न: यह जब/क्यों एक JContainer का प्रयोग करेंगे जब ऐसा लगता है कि JToken और JObject वस्तुओं काफी अच्छी तरह से Linq के साथ काम ... JContainer का उद्देश्य क्या है मेरे लिए स्पष्ट नहीं है ???
आपके पहले उदाहरण में, (JToken) JsonConvert.DeserializeObject ("[1, 2, 3]") का उपयोग भी करता है। मैं दूसरे जवाब से देखता हूं कि जेकॉन्टेनर अन्य जेटीकेन्स सहित जेटीकेन कर सकते हैं। क्या यह एकमात्र अंतर है? आपका दूसरा उदाहरण काम करता है, धन्यवाद! – Jazimov
JToken सभी JSON तत्वों के लिए आधार वर्ग है। स्ट्रिंग में आपके द्वारा अपेक्षित तत्व के प्रकार के लिए आपको केवल पार्स विधि का उपयोग करना चाहिए। यदि आपको नहीं पता कि यह क्या है, तो JToken का उपयोग करें, और फिर आप इसे जॉब्जेक्ट, जेएरे, इत्यादि में डालने में सक्षम होंगे। इस मामले में आप हमेशा जॉब्जेक्ट की अपेक्षा करते हैं, इसलिए इसका उपयोग करें। JContainer का उपयोग करना केवल तब उपयोगी होता है जब आप माता-पिता की देखभाल किए बिना बच्चे के सामानों की गणना करना चाहते हैं। –