न्यूटनसॉफ्ट जोंस डिसेरिएलाइज़


83

मेरा JSON इस प्रकार है:

{"t":"1339886","a":true,"data":[],"Type":[['Ants','Biz','Tro']]}

मुझे C # के लिए न्यूटनसॉफ्ट JSON.NET डिसेरियलाइज़ लाइब्रेरी मिली। मैंने इसका अनुसरण करने की कोशिश की:

object JsonDe = JsonConvert.DeserializeObject(Json); 

मैं JsonDeसभी "प्रकार" डेटा प्राप्त करने के लिए ऑब्जेक्ट तक कैसे पहुंच सकता हूं ? मैंने इसे एक लूप के साथ आज़माया लेकिन यह काम नहीं कर रहा है क्योंकि ऑब्जेक्ट में एन्यूमरेटर नहीं है।



इस सवाल के जवाब पर आपकी नज़र होनी चाहिए: stackoverflow.com/questions/11126242/…
डाइट्ज़

जवाबों:


133

आप अपने जेएसएन में उन क्षेत्रों को लागू कर सकते हैं जो आपके पास हैं

class MyData
{
    public string t;
    public bool a;
    public object[] data;
    public string[][] type;
}

और फिर DeserializeObject के सामान्य संस्करण का उपयोग करें:

MyData tmp = JsonConvert.DeserializeObject<MyData>(json);
foreach (string typeStr in tmp.type[0])
{
    // Do something with typeStr
}

प्रलेखन: सीरियल और वर्णन करना JSON


मैंने सिर्फ एक उदाहरण जोड़ा है जो उपयोगी होना चाहिए। यह मेरे लिए एक रहस्य है कि "प्रकार" सूचियों (एरे सरणी) की एक सूची क्यों है - लेकिन यह आपके द्वारा दिए गए json स्ट्रिंग के साथ संरेखित होना चाहिए।
माइकल बंजोन

1
आपके उत्तर के लिए बहूत बहूत धन्यवाद। इसने मेरी समस्या को हल करने में मेरी मदद की :)
सन्तोष कुमार ने 19

मैं एक कलाकार का उपयोग कर रहा था जो असफल हो रहा था MyData tmp = (MyData)JsonConvert.DeserializeObject(json);। Deserialize का सामान्य संस्करण बहुत बेहतर काम करता है, धन्यवाद। :-)
शार्प मार्क

ठीक है, मैं इसे यहाँ लिखता हूँ: dotnet add package Newtonsoft.Jsonऔर using Newtonsoft.Json;
दानी हेररा

83

एक बहुत आसान समाधान: एक गतिशील प्रकार का उपयोग करना

Json.NET 4.0 रिलीज 1 के रूप में, मूल गतिशील समर्थन है। आपको एक वर्ग घोषित करने की आवश्यकता नहीं है, बस उपयोग करें dynamic:

dynamic jsonDe = JsonConvert.DeserializeObject(json);

सभी क्षेत्र उपलब्ध होंगे:

foreach (string typeStr in jsonDe.Type[0])
{
    // Do something with typeStr
} 

string t = jsonDe.t;
bool a = jsonDe.a;
object[] data = jsonDe.data;
string[][] type = jsonDe.Type;

गतिशील के साथ आपको अपना डेटा रखने के लिए एक विशिष्ट वर्ग बनाने की आवश्यकता नहीं है।


10
अच्छा जवाब है, करने के लिए मुझे शुरू करने के लिए धन्यवाद dynamic:)
maialithar

2
यह निश्चित रूप से आसान है। लेकिन इसका नुकसान यह है कि आसानी से जांचने में सक्षम नहीं होने पर यदि कोई संपत्ति मौजूद है (आपको अपवाद हैंडलिंग का उपयोग करना चाहिए)।
Jowen

2
@Jowen यह देखने के लिए कि अपवाद के बिना कोई संपत्ति मौजूद है या नहीं, उन उत्तरों
यवेस एम।

बहुत बहुत धन्यवाद 1 !! सबसे सरल समाधान ive इतने लंबे समय से
दिख रहा है

10

न्यूटनसॉफ्ट डॉक्यूमेंटेशन के अनुसार, आप इस तरह से किसी अनाम ऑब्जेक्ट को डीसर्विलाइज़ भी कर सकते हैं:

var definition = new { Name = "" };

string json1 = @"{'Name':'James'}";
var customer1 = JsonConvert.DeserializeAnonymousType(json1, definition);

Console.WriteLine(customer1.Name);
// James

अब यह स्मार्ट है! ;-) लेकिन यह अनाड़ी हो जाता है जब परिभाषा आपके उदाहरण के रूप में सीधे-आगे नहीं होती है।
संन्यासीƒउन

मुझे इस बारे में कुछ नहीं पता definition, मुझे DeserializeAnonymousTypeइस मामले में कैसे उपयोग करना चाहिए ?
मेहदी देहगानी 5

यह एक बेकार उदाहरण है, क्योंकि अधिकांश JSON कहीं भी उस सरलीकृत के पास नहीं है। मैं एक परिभाषा देखना चाहता हूँ जो अधिक बारीकी से नेस्टेड गुणों के साथ एक JSON स्ट्रिंग जैसा दिखता है ...
pmfith
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.