json.net कुंजी विधि है?


140

यदि मेरी प्रतिक्रिया में कुंजी "त्रुटि" है, तो मुझे त्रुटि को संसाधित करने और चेतावनी बॉक्स दिखाने की आवश्यकता है।

क्या json.net में "haskey" पद्धति मौजूद है? पसंद:

var x= JObject.Parse(string_my);
if(x.HasKey["error_msg"])
    MessageBox.Show("Error!")

1
कृपया मेरे उत्तर को यहाँ देखें ।
बेन

मैंने यहां इसी तरह की समस्या के साथ एक सवाल का जवाब दिया: stackoverflow.com/a/47204235/1037314
बेन

1
इस प्रश्न के दो संस्करण हैं: एक संस्करण वह है जहाँ JSON शब्दकोष समतल है (कोई बच्चे नहीं) और दूसरा, जहाँ कुंजी बच्चों के पदानुक्रम में कहीं है। इसे लिखने के समय, nsjson के पास अभी भी कोई सुविधा विधि नहीं है जो कुंजी के लिए परीक्षण करने के लिए आसान पहुंच प्रदान करेगी।
ljgww

जवाबों:


240

बस उपयोग करें x["error_msg"]। यदि संपत्ति मौजूद नहीं है, तो यह वापस आ जाता है null


37
यदि संपत्ति का मूल्य क्या है null?
एंड्रियास फ्यूरिस्टर

67
@AndreasFurster फिर यह JValueकिसका Valueहै null, सिर्फ वापस नहीं आएगा null
svick

1
यदि संपत्ति हो सकती है nullतो आप यह x["error_msg"] is Objectजांचने के लिए उपयोग कर सकते हैं कि संपत्ति JSON ऑब्जेक्ट में परिभाषित है या नहीं
stonito

2
@ user3199329 यह लिखने का एक भ्रमित करने वाला तरीका है x["error_msg"] != null, इसलिए नहीं, यह जांच नहीं करता है कि संपत्ति मौजूद है और इसका मूल्य है null
svick

9
@ WilliamT.Mallard C # 6 में, आप null-सशर्त इंडेक्स ऑपरेटर का उपयोग करके इसे सरल बना सकते हैं myJObject["level1property"]?["level2property"]:।
svick

98

JObjectऔजार IDictionary<string, JToken>, ताकि आप उपयोग कर सकें:

IDictionary<string, JToken> dictionary = x;
if (dictionary.ContainsKey("error_msg"))

... या आप उपयोग कर सकते हैं TryGetValue। यह स्पष्ट इंटरफ़ेस कार्यान्वयन का उपयोग करके दोनों तरीकों को लागू करता है, इसलिए आप उन्हें पहले परिवर्तित किए बिना उपयोग नहीं कर सकते हैं IDictionary<string, JToken>


मैं यह धीरे धीरे फिर स्वीकार किए जाते हैं, लेकिन धन्यवाद होगा।
सेवनडे

2
@wsevendays, यहाँ आपके लिए गति मायने रखती है या सिर्फ microoptimizing (और अनुमानों पर आधारित है)? आपको वह उपयोग करना चाहिए जो आपको अधिक पठनीय लगे।
21

मेरे WP7 फोन की 1GHz प्रोसेसर की गति महान नहीं है और मुझे गति के बारे में ध्यान रखने की आवश्यकता है।
सेवनडे

1
@wsevendays: स्वीकृत उत्तर की तुलना में यह धीमा (या तेज) क्यों होगा?
जॉन स्कीट

24
@wsevenday: नहीं, यह एक शब्दकोश नहीं बनाता है। JObject पहले से ही लागू है IDictionary<string, JToken> । यह केवल एक संदर्भ असाइनमेंट है। और नहीं, स्वीकार किए गए उत्तर की जाँच नहीं हो रही है कि क्या कुंजी किसी सरणी में है ... यह अभी भी एक सामान्य अनुक्रमणिका का उपयोग कर रहा है। सिर्फ इसलिए कि यह लग रहा है सरणी पहुँच की तरह मतलब यह नहीं है यह है सरणी का उपयोग कर सकते। (ऐरे एक्सेस पहली जगह में एक स्ट्रिंग द्वारा नहीं हो सकता।)
जॉन स्कीट

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.