मैं एक जोबजेक्ट के माध्यम से कैसे गणना करूं?


111

मैं यह निर्धारित करने की कोशिश कर रहा हूं कि मेरे जोबजेक्ट में मौजूद डेटा तक कैसे पहुंचा जाए और मैं अपने जीवन के लिए यह निर्धारित नहीं कर सकता कि इसका उपयोग कैसे किया जाए।

JObject Object = (JObject)Response.Data["my_key"];

मैं इसे कंसोल कंसोल को कर रहा हूं। कंसोलाइट (ऑब्जेक्ट) और मैं डेटा देखता हूं, ऐसा दिखता है:

{
 "my_data" : "more of my string data"
...
}

लेकिन मेरे पास कोई विचार नहीं है कि कैसे इसके माध्यम से बस पुनरावृत्ति / गणना करना, किसी के पास कोई विचार है? मैं अभी इस तरह के नुकसान में हूं।

जवाबों:


167

यदि आप के लिए प्रलेखनJObject को देखते हैं, तो आप देखेंगे कि यह लागू होता है IEnumerable<KeyValuePair<string, JToken>>। तो, आप इस पर आसानी से उपयोग कर सकते हैं foreach:

foreach (var x in obj)
{
    string name = x.Key;
    JToken value = x.Value;
    
}

3
यह सही है, लेकिन जिन कारणों से मुझे समझ नहीं आ रहा है, आप इसे Linq के साथ उपयोग नहीं कर सकते हैं जब तक कि आप स्पष्ट रूप से गणना करने योग्य प्रकार के लिए नहीं डाले जाते हैं। ((IEnumerable<KeyValuePair<string, JToken>>)obj).Select(...)सादे-पुराने के बजाय आप obj.Select(...); या कम से कम यही मुझे अपने कोड का एक हिस्सा मिला।
एड्रियन रत्नापाल

2
@ AdrianRatnapala क्या आपकी obj को गतिशील घोषित किया गया है? एक्सटेंशन विधियाँ (जैसे Enumerable.Select) उस के साथ काम नहीं करती हैं।
svick

1
नहीं, मेरे मामले objमें टाइप था JObject; लेकिन JObjectलगता है कि इसी तरह की समस्याएं हैं dynamic। कंपाइलर टाइप तर्कों का अनुमान नहीं लगा सकता है .Select। मैं उन्हें obj.Select<KeyValuePair<string, JToken>, (result type)>(...)
विस्तार से बता

3
@ AdrianRatnapala हम्म, तुम सही हो। ऐसा इसलिए है क्योंकि JObjectदोनों ( IEnumerable<KeyValuePair<string, JToken>>और IEnumerable<JToken>परोक्ष रूप से JContainer) को लागू करता है ।
svick

3
अब मैं इसे नेस्टेड JSON के लिए कैसे उपयोग करूं? उदाहरण के लिए, यदि "मान" में कुंजी का एक और सेट है: मूल्य जोड़े, मैं JToken valueजोड़े के अगले सेट के माध्यम से पुनरावृति का उपयोग कैसे कर सकता हूं ?
अल्बाट्रॉसकैफ़

53

जोबोक्रेपी वस्तुओं के माध्यम से इसे एक जेटोकैन में डालकर जॉबजेक्ट की गणना की जा सकती है :

foreach (JProperty x in (JToken)obj) { // if 'obj' is a JObject
    string name = x.Name;
    JToken value = x.Value;
}

यदि आपके पास एक और जोबजेक्ट के अंदर एक नेस्टेड जोबजेक्ट है, तो आपको कास्ट करने की आवश्यकता नहीं है क्योंकि एक्सेसर एक जोकर को लौटा देगा:

foreach (JProperty x in obj["otherObject"]) { // Where 'obj' and 'obj["otherObject"]' are both JObjects
    string name = x.Name;
    JToken value = x.Value;
}

3
तुम भी आसानी से linq का उपयोग कर सकते हैं जैसे obj.Properties().Select(p => p.Name + ": " + p.Value):।
इसका लालन

यह ठीक वही जानकारी थी जिसकी मुझे तलाश थी। आपको बहुत - बहुत धन्यवाद!
झोकेकेन

15

जवाब मेरे काम नहीं आया। मुझे नहीं पता कि इसे इतने वोट कैसे मिले। हालांकि इससे मुझे एक दिशा में इशारा करने में मदद मिली।

यह जवाब है कि मेरे लिए काम किया है:

foreach (var x in jobj)
{
    var key = ((JProperty) (x)).Name;
    var jvalue = ((JProperty)(x)).Value ;
}

1
उसके साथ (इस पंक्ति के बाद: JObject priceComplianceJson = JObject.Parse (File.ReadAllText (fullPath));) मुझे मिलता है, "प्रकार परिवर्तित नहीं कर सकता 'System.Collections.Golic.KeyValuePair <string, Newtonsoft.Json.Linq.JToken'। "Newtonsoft.Json.Linq.JProperty '" कास्टिंग कार्यों को हटाना, हालांकि: var key = x.Key; var jvalue = x.Value; - कम से कम यह संकलित करता है ... मैं कल कार्यक्षमता को चेक करूंगा।
बी क्ले शैनन

3

मेरे जैसे लोगों के लिए, LINQ नशा है, और के आधार पर svick का जवाब , यहाँ एक LINQ दृष्टिकोण:

using System.Linq;
//...
//make it linq iterable. 
var obj_linq = Response.Cast<KeyValuePair<string, JToken>>();

अब आप linq के भाव बना सकते हैं जैसे:

JToken x = obj_linq
          .Where( d => d.Key == "my_key")
          .Select(v => v)
          .FirstOrDefault()
          .Value;
string y = ((JValue)x).Value;

या केवल:

var y = obj_linq
       .Where(d => d.Key == "my_key")
       .Select(v => ((JValue)v.Value).Value)
       .FirstOrDefault();

या यह सभी डेटा पर पुनरावृति करने के लिए:

obj_linq.ToList().ForEach( x => { do stuff } ); 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.