2016-07-25 8 views
5

* इस प्रश्न को लिखते/संपादित करते समय, मैंने अपने स्वयं के प्रश्न का उत्तर देना शुरू कर दिया। अधिक जानकारी के लिए पढ़ें लेकिन बोल्ड में, मेरा वास्तविक प्रश्न बहुत अंत में है। धन्यवाद! *जेकॉन्टैनर, जॉब्जेक्ट, जेटोकन और लिंक भ्रम

मुझे 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 का उद्देश्य क्या है मेरे लिए स्पष्ट नहीं है ???

उत्तर

7

JContainer जेएसओएन तत्वों के लिए आधार वर्ग है जिसमें बाल वस्तुएं हैं।JObject, JArray, JProperty और JConstructor सभी इससे प्राप्त होते हैं।

उदाहरण के लिए

, निम्नलिखित कोड:

(JObject)JsonConvert.DeserializeObject("[1, 2, 3]") 

एक InvalidCastException फेंक सकते हैं, लेकिन यदि आप इसे एक JContainer लिए डाली है, यह ठीक होगा।

अपने मूल प्रश्न के बारे में

, यदि आप जानते हैं कि आप शीर्ष स्तर पर एक JSON वस्तु है, तो आप सिर्फ उपयोग कर सकते हैं:

var jsonWork = JObject.Parse(json); 
var jsonObject1 = o["Object1"]; 
+0

आपके पहले उदाहरण में, (JToken) JsonConvert.DeserializeObject ("[1, 2, 3]") का उपयोग भी करता है। मैं दूसरे जवाब से देखता हूं कि जेकॉन्टेनर अन्य जेटीकेन्स सहित जेटीकेन कर सकते हैं। क्या यह एकमात्र अंतर है? आपका दूसरा उदाहरण काम करता है, धन्यवाद! – Jazimov

+1

JToken सभी JSON तत्वों के लिए आधार वर्ग है। स्ट्रिंग में आपके द्वारा अपेक्षित तत्व के प्रकार के लिए आपको केवल पार्स विधि का उपयोग करना चाहिए। यदि आपको नहीं पता कि यह क्या है, तो JToken का उपयोग करें, और फिर आप इसे जॉब्जेक्ट, जेएरे, इत्यादि में डालने में सक्षम होंगे। इस मामले में आप हमेशा जॉब्जेक्ट की अपेक्षा करते हैं, इसलिए इसका उपयोग करें। JContainer का उपयोग करना केवल तब उपयोगी होता है जब आप माता-पिता की देखभाल किए बिना बच्चे के सामानों की गणना करना चाहते हैं। –

50

आप वास्तव में ज्यादातर मामलों में JContainer बारे में चिंता करने की जरूरत नहीं है। यह अच्छी तरह से फैक्टर कोड में LINQ-to-JSON को व्यवस्थित और संरचना करने में मदद करने के लिए है।

JToken पदानुक्रम इस तरह दिखता है:

JToken    - abstract base class  
    JContainer  - abstract base class of JTokens that can contain other JTokens 
     JArray  - represents a JSON array (contains an ordered list of JTokens) 
     JObject  - represents a JSON object (contains a collection of JProperties) 
     JProperty - represents a JSON property (a name/JToken pair inside a JObject) 
    JValue   - represents a primitive JSON value (string, number, boolean, null) 

तो आप देखते हैं, एक JObject एक JContainer है, जो एक JToken है।

यहाँ अंगूठे का बुनियादी नियम है:

  • आप जानते हैं कि आप एक वस्तु है, तो (घुंघराले ब्रेसिज़ { और JSON में } से चिह्नित), JObject
  • का उपयोग आप जानते हैं कि आप किसी सरणी या सूची है (वर्ग कोष्ठक [ और ] से चिह्नित), का उपयोग JArray
  • आप जानते हैं कि आप एक आदिम मूल्य है, का उपयोग JValue
  • आप तो पता नहीं है कि आपके पास किस प्रकार का टोकन है, या किसी भी सामान्य तरीके से उपरोक्त में से किसी को संभालने में सक्षम होना चाहते हैं, JToken का उपयोग करें। इसके बाद आप यह निर्धारित करने के लिए Type संपत्ति देख सकते हैं कि यह किस प्रकार का टोकन है और इसे उचित रूप से डालें।
+0

यह उत्तर सबसे अधिक जानकारीपूर्ण है, मैंने हर जगह देखा है कि वे सभी कैसे संबंधित हैं, और बम! इसके लिए धन्यवाद, वास्तव में एक पूरी तरह से बोली बिट्स की सराहना करते हैं। – Chopnut

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