2012-12-03 15 views
37

मैं आने वाले कच्चे JSON पर गतिशील deserialisation करने के लिए न्यूटॉन्सॉफ्ट JSON लाइब्रेरी का उपयोग कर रहा हूं और कुछ ऐसा पाया है जिसे मैं समझा नहीं सकता।न्यूटॉन्सॉफ्ट JSON - डायनामिक ऑब्जेक्ट्स

{ 
    "task": { 
    "dueDate": "2012-12-03T00:00:00" 
    } 
} 

कुछ भी नहीं है वहाँ बहुत जटिल ...

कोड में मैं तो यह कर रहा हूं:

प्रारंभिक बिंदु निम्नलिखित JSON स्ट्रिंग है

var dyn = JsonConvert.DeserializeObject<dynamic>(rawJson); 
DateTime dueDate = dyn.task.dueDate.Value; 

इस कोड को कर दिया गया है महीनों के लिए जगह में और ठीक काम करता है, हालांकि हाल के परीक्षण में हम निम्नलिखित त्रुटि देख रहे थे:

,

DateTime dueDate = dyn.task.dueDate.Value; 

को
DateTime dueDate = dyn["task"]["dueDate"].Value; 

इसलिए हालांकि यह मैं "निर्धारित" है: 210

'Newtonsoft.Json.Linq.JObject' does not contain a definition for 'task'

Stack Trace: at CallSite.Target(Closure , CallSite , Object) at System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0)

अब इस जहां है अजीब हो जाता है, सब कुछ फिर से काम करने के लिए अगर मैं से ऊपर कोड बदलने शुरू होता है समझ में नहीं आता कि यह क्यों ठीक करता है और संभावित कारण क्या हो सकता है। किसी को भी किसी भी विचार

है
+0

क्या आपने जेसन.नेट का संस्करण बदल दिया है जिसका आप उपयोग कर रहे हैं? –

+0

नहीं, यह मेरा पहला विचार था - कोड और लाइब्रेरी दोनों में परिवर्तन इतिहास को देखते हुए लाइव – MrEyes

+4

में क्या (और काम कर रहा है) में कोई बदलाव नहीं दिखाता है क्या आप वाकई "पहला मौका अपवाद" नहीं हैं - सामान्य गतिशीलता (हो सकता है कि आपने अपनी त्रुटि लॉगिन आदि में विवरण स्तर बढ़ाया हो)? – tpeczek

उत्तर

41

आप इस कोशिश कर सकते हैं:

dynamic task = JObject.Parse(rawJson); 

प्रलेखन: Querying JSON with dynamic

+0

यह बहुत अच्छा काम करता है, आश्चर्य है कि यह स्वीकार्य उत्तर क्यों नहीं है। – Saturnix

+11

क्योंकि वह यह समझने के लिए कह रहा है कि यह प्रदान किए गए उदाहरण में क्यों काम नहीं करता है, क्योंकि यह * प्रदान किए गए उदाहरण के लिए * काम करना चाहिए। –

+1

यह मेरे लिए, एक ही त्रुटि को हल नहीं किया। – Ted

1

यह निश्चित रूप से कुछ संदर्भित मुद्दा है, मैं तो बस एक ही समस्या थी, पता चला है मुद्दा यह है कि मैं था प्रोजेक्ट में संकुल फ़ोल्डर को जोड़ा गया ताकि मैं इसे VSS (माफ करना, अनिवार्य) में देख सकूं, जैसे ही मैंने विजुअल स्टूडियो से संकुल फ़ोल्डर हटा दिया, यह ठीक काम करना शुरू कर दिया

+2

वीएसएस ... ओच! ऐसा सुनने के लिए क्षमा करें। –

1

मुझे एक ऐप के साथ एक ही समस्या थी यू जेसन.NET गाओ। यह मुद्दा केवल एक विशिष्ट मशीन पर दोहराया गया और यह पता चला कि मशीन में जीएसी में स्थापित जेसन.नेट का एक और संस्करण था। जीएसी से इसे हटाने के बाद ऐप सही तरीके से काम करना शुरू कर दिया।

+0

यह मेरे लिए एक ही मुद्दा था! –

5

मेरे मामले में यह पता चला कि मैं पहली मौका अपवाद पकड़ रहा था, इसलिए हालांकि इस अपवाद को फेंक दिया गया था, वास्तव में, मेरे कोड को निष्पादित करने से रोकना नहीं था।

यह जानना अच्छा होगा कि यह Json.NET द्वारा deserialized कुछ सामग्री के लिए क्यों होता है, लेकिन सभी सामग्री नहीं। उदाहरण के लिए, मेरे पास एक गतिशील ऑब्जेक्ट है जो मैं एक यूनिट टेस्ट में json.net के साथ क्रमबद्ध करता हूं, फिर धारावाहिक सामग्री को deserialize। क्रमबद्ध सामग्री सामग्री के समान दिखती है, जो रन टाइम पर रनटाइम बाइंडर अपवादों को फेंकने का कारण बनती है।

4

मुझे एक ही समस्या थी।

Json.NET 6.0.4 इस समस्या का कारण बनता है। आपको इसे Json.Net 6.0.5 में बदलना चाहिए। किसी भी परियोजना को Json.NET 6.0.4 का संदर्भ नहीं देना चाहिए।

उपकरण पर जाएं -> NuGet पैकेज प्रबंधक -> समाधान के लिए NuGet पैकेज प्रबंधित करें ... और जांचें, यदि कोई भी परियोजना Json.NET 6.0.4 का उपयोग करती है, तो उन्हें ठीक करें।

+0

रिकॉर्ड के लिए, जेसन.NET 6.0.3 के साथ एक ही समस्या। फिक्स्ड नवीनतम संस्करण 7.0.1। –

+2

एक दिलचस्प एक तरफ के रूप में, मैंने Newtonsoft.JSON स्रोत डाउनलोड किया और "कार्य" पर एक खोज की। ओपी सटीक कच्चे JSON को एक परीक्षण विधि में दर्ज किया जाता है ... कौन जानता है कि यह क्यों हुआ लेकिन न्यूटनसॉफ्ट में कोई इसे पढ़ रहा है। ऐसा लगता है कि नीचे की रेखा यह है कि यह लाइब्रेरी के साथ एक बग है (या था)। – RLH

+0

मेरे पास यह समस्या v 7.0.0.0 में है, ऐसा लगता है ... – Ted

1

मुझे यह समस्या थोड़ी देर के लिए चल रही थी, डीएलएल का उपयोग .NET 3.5 के लिए संकलित किया गया था जो गतिशीलता का समर्थन नहीं करता था .... सुनिश्चित करें कि आपका डीएलएल .NET 4 के लिए संकलित है।5 और ऊपर

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