JSON सरणी को उदासीन नहीं कर सकता (जैसे [1,2,3]) टाइप '' में क्योंकि टाइप के लिए JSON ऑब्जेक्ट की आवश्यकता होती है (उदाहरण के लिए {"name": "value"})


98

मेरे पास यह JSON है:

[
    {
        "Attributes": [
            {
                "Key": "Name",
                "Value": {
                    "Value": "Acc 1",
                    "Values": [
                        "Acc 1"
                    ]
                }
            },
            {
                "Key": "Id",
                "Value": {
                    "Value": "1",
                    "Values": [
                        "1"
                    ]
                }
            }
        ],
        "Name": "account",
        "Id": "1"
    },
    {
        "Attributes": [
            {
                "Key": "Name",
                "Value": {
                    "Value": "Acc 2",
                    "Values": [
                        "Acc 2"
                    ]
                }
            },
            {
                "Key": "Id",
                "Value": {
                    "Value": "2",
                    "Values": [
                        "2"
                    ]
                }
            }
        ],
        "Name": "account",
        "Id": "2"
    },
    {
        "Attributes": [
            {
                "Key": "Name",
                "Value": {
                    "Value": "Acc 3",
                    "Values": [
                        "Acc 3"
                    ]
                }
            },
            {
                "Key": "Id",
                "Value": {
                    "Value": "3",
                    "Values": [
                        "3"
                    ]
                }
            }
        ],
        "Name": "account",
        "Id": "2"
    }
]

और मेरे पास ये कक्षाएं हैं:

public class RetrieveMultipleResponse
{
    public List<Attribute> Attributes { get; set; }
    public string Name { get; set; }
    public string Id { get; set; }
}

public class Value
{
    [JsonProperty("Value")]
    public string value { get; set; }
    public List<string> Values { get; set; }
}

public class Attribute
{
    public string Key { get; set; }
    public Value Value { get; set; }
}

मैं नीचे दिए गए कोड का उपयोग करके ऊपर दिए गए JSON को डिसेर्बलाइज करने की कोशिश कर रहा हूं:

var objResponse1 = JsonConvert.DeserializeObject<RetrieveMultipleResponse>(JsonStr);

लेकिन मुझे यह त्रुटि मिल रही है:

वर्तमान JSON सरणी (जैसे [1,2,3]) को 'test.Model.RetrieveMultipleResponse' में टाइप नहीं कर सकता क्योंकि टाइप के लिए JSON ऑब्जेक्ट (जैसे {"name": "value"}) को सही ढंग से deserialize करने की आवश्यकता है। इस त्रुटि को ठीक करने के लिए या तो JSON को JSON ऑब्जेक्ट (जैसे {"name": "value"}) में बदलें या किसी सरणी में deserialized प्रकार को बदलें या एक प्रकार जो संग्रह इंटरफ़ेस को लागू करता है (जैसे ICollection, IList) जैसे कि सूची। JSON सरणी से deserialized हो। JSONArrayAttribute को JSON सरणी से डिसेरिएलाइज़ करने के लिए इसे टाइप करने के लिए भी जोड़ा जा सकता है। पथ '', पंक्ति 1, स्थिति 1।

जवाबों:


161

आपका जसन स्ट्रिंग वर्गाकार कोष्ठक ( []) के भीतर लपेटा जाता है , इसलिए इसे एकल RetrieveMultipleResponseवस्तु के बजाय सरणी के रूप में व्याख्या किया जाता है । इसलिए, आपको RetrieveMultipleResponseउदाहरण के लिए, इसका संग्रह टाइप करने की आवश्यकता है :

var objResponse1 = 
    JsonConvert.DeserializeObject<List<RetrieveMultipleResponse>>(JsonStr);

मुझे "//" befor "[" को हटाना पड़ा, फिर इसने मेरे लिए काम किया। धन्यवाद
भड़कीले

1
यदि आप इसे एक संग्रह के बजाय एक ही वस्तु के रूप में रखना चाहते हैं, तो क्या आप सिर्फ JsonStr.Replace ("[", "") को बदल सकते हैं।
रिच

FYI करें यह मेरे लिए काम नहीं किया क्योंकि मैं एक एपीआई से मेरे JSON हो रहा था और मैं पूरे दिन के लिए गलत URL गलत था। > <
w00ngy

1
यहाँ RetrieveMultipleResponse क्या है?
उमंग में

धन्यवाद यह मेरे लिए काम करता है var objResponse1 = JsonConvert.DeserializeObject <List <QuestionData >> (srt); // myWord = myQuestionData.Word; डीबग.लॉग ("myWord" + objResponse1 [0]। वर्ड);
स्टैकबड्डी 2

10

अगर कोई जेनरिक का समर्थन करना चाहता है (एक विस्तार विधि में) यह पैटर्न है ...

public  static List<T> Deserialize<T>(this string SerializedJSONString)
{
    var stuff = JsonConvert.DeserializeObject<List<T>>(SerializedJSONString);
    return stuff;
}

इसका उपयोग इस तरह किया जाता है:

var rc = new MyHttpClient(URL);
//This response is the JSON Array (see posts above)
var response = rc.SendRequest();
var data = response.Deserialize<MyClassType>();

MyClassType इस तरह दिखता है (JSON सरणी के नाम मान युग्म से मेल खाना चाहिए)

[JsonObject(MemberSerialization = MemberSerialization.OptIn)]
 public class MyClassType
 {
    [JsonProperty(PropertyName = "Id")]
    public string Id { get; set; }

    [JsonProperty(PropertyName = "Name")]
    public string Name { get; set; }

    [JsonProperty(PropertyName = "Description")]
    public string Description { get; set; }

    [JsonProperty(PropertyName = "Manager")]
    public string Manager { get; set; }

    [JsonProperty(PropertyName = "LastUpdate")]
    public DateTime LastUpdate { get; set; }
 }

Newtonsoft.Json को डाउनलोड करने के लिए NUGET का उपयोग करें जहां जरूरत हो ...

using Newtonsoft.Json;

4

समाधान के लिए एक टिप्पणी नहीं जोड़ सकते, लेकिन यह मेरे लिए काम नहीं किया। समाधान जो मेरे लिए काम करता था वह था:

var des = (MyClass)Newtonsoft.Json.JsonConvert.DeserializeObject(response, typeof(MyClass)); 
return des.data.Count.ToString();

जोर से टाइप किए गए .NET ऑब्जेक्ट में JSON सरणी का वर्णन करना


0
var objResponse1 = 
JsonConvert.DeserializeObject<List<RetrieveMultipleResponse>>(JsonStr);

काम किया!


यह प्रश्न का उत्तर प्रदान नहीं करता है। एक बार आपके पास पर्याप्त प्रतिष्ठा होने के बाद आप किसी भी पोस्ट पर टिप्पणी कर पाएंगे ; इसके बजाय, ऐसे उत्तर प्रदान करें जिन्हें पूछने वाले से स्पष्टीकरण की आवश्यकता न हो । - समीक्षा से
माइक

0

इसका प्रयोग करें, FrontDataJSON स्ट्रिंग है:

var objResponse1 = JsonConvert.DeserializeObject<List<DataTransfer>>(FrontData);  

और निकालने की सूची:

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