2013-10-25 5 views
10

मैं की तरहकैसे सी # में वस्तुओं की सूची में JSON सारणी कन्वर्ट करने के लिए

नीचे
{ 
"JsonValues":{ 

     "id": "MyID", 

     "values": { 
      "value1":{ 
       "id": "100", 
       "diaplayName": "MyValue1" 
      }, 
      "value2":{ 
       "id": "200", 
       "diaplayName": "MyValue2" 
      } 
     } 
} 
} 

मैं वर्गों

नीचे करने के लिए JSON स्ट्रिंग परिवर्तित करना चाहते हैं Json स्ट्रिंग है
class ValueSet 
    { 
    [JsonProperty("id")] 
    public string id 
    { 
     get; 
     set; 
    } 
    [JsonProperty("values")] 
    public List<Value> values 
    { 
     get; 
     set; 
    } 
    } 

class Value 
{ 
    public string id 
    { 
     get; 
     set; 
    } 
    public string DiaplayName 
    { 
     get; 
     set; 
    } 
} 

मेरे अक्रमांकन कोड

है
JavaScriptSerializer js = new JavaScriptSerializer(); 
     StreamReader sr = new StreamReader(@"ValueSetJsonString.txt"); 
     string jsonString = sr.ReadToEnd(); 
     var items = JsonConvert.DeserializeObject<ValueSet>(jsonString); 

लेकिन मुझे serialization के बाद शून्य मान मिल रहा है, मैं इसे कैसे हल कर सकता हूं?

उत्तर

13

जैसा कि अन्य लोगों ने पहले से ही बताया है, आप जिन परिणामों को उम्मीद कर रहे हैं उन्हें प्राप्त नहीं कर रहा है क्योंकि आपका JSON वर्ग संरचना से मेल नहीं खाता है जिसे आप deserialize करने की कोशिश कर रहे हैं। आपको या तो अपने JSON को बदलने या अपनी कक्षाओं को बदलने की जरूरत है। चूंकि अन्य ने पहले से ही जेएसओएन को बदलने का तरीका दिखाया है, इसलिए मैं यहां विपरीत दृष्टिकोण लेगा।

आपके प्रश्न में पोस्ट किए गए JSON से मेल खाने के लिए, आपकी कक्षाओं को नीचे दिए गए लोगों की तरह परिभाषित किया जाना चाहिए। नोटिस मैंने निम्नलिखित परिवर्तन किए हैं:

  1. मैंने आपके JSON में बाहरी ऑब्जेक्ट के अनुरूप Wrapper कक्षा जोड़ा।
  2. मैं के बाद से अपने JSON में values संपत्ति एक वस्तु, नहीं एक सरणी शामिल एक एक Dictionary<string, Value> करने के लिए List<Value> से ValueSet वर्ग के Values संपत्ति बदल दिया है।
  3. मैंने आपके JSON ऑब्जेक्ट्स में प्रॉपर्टी नामों से मेल खाने के लिए कुछ अतिरिक्त [JsonProperty] विशेषताओं को जोड़ा।

कक्षा परिभाषाएँ:

class Wrapper 
{ 
    [JsonProperty("JsonValues")] 
    public ValueSet ValueSet { get; set; } 
} 

class ValueSet 
{ 
    [JsonProperty("id")] 
    public string Id { get; set; } 
    [JsonProperty("values")] 
    public Dictionary<string, Value> Values { get; set; } 
} 

class Value 
{ 
    [JsonProperty("id")] 
    public string Id { get; set; } 
    [JsonProperty("diaplayName")] 
    public string DisplayName { get; set; } 
} 

आप Wrapper वर्ग, नहीं ValueSet वर्ग में deserialize की जरूरत है। इसके बाद आप Wrapper से ValueSet प्राप्त कर सकते हैं। यहाँ

class Program 
{ 
    static void Main(string[] args) 
    { 
     string jsonString = @" 
     { 
      ""JsonValues"": { 
       ""id"": ""MyID"", 
       ""values"": { 
        ""value1"": { 
         ""id"": ""100"", 
         ""diaplayName"": ""MyValue1"" 
        }, 
        ""value2"": { 
         ""id"": ""200"", 
         ""diaplayName"": ""MyValue2"" 
        } 
       } 
      } 
     }"; 

     var valueSet = JsonConvert.DeserializeObject<Wrapper>(jsonString).ValueSet; 

     Console.WriteLine("id: " + valueSet.Id); 
     foreach (KeyValuePair<string, Value> kvp in valueSet.Values) 
     { 
      Console.WriteLine(kvp.Key + " id: " + kvp.Value.Id); 
      Console.WriteLine(kvp.Key + " name: " + kvp.Value.DisplayName); 
     } 
    } 
} 

और उत्पादन होता है:

var valueSet = JsonConvert.DeserializeObject<Wrapper>(jsonString).ValueSet; 

यहाँ एक काम कर कार्यक्रम प्रदर्शित करने के लिए है

id: MyID 
value1 id: 100 
value1 name: MyValue1 
value2 id: 200 
value2 name: MyValue2 
+0

द (जेसनस्ट्रिंग)। वैल्यूसेट; प्रत्यय मेरे लिए किया था! – peterincumbria

0

आप एक बेजोड़ JSON स्ट्रिंग है, यदि आप एक सूची में कनवर्ट करना चाहते हैं, इस

{ 
    "id": "MyID", 

    "values": [ 
     { 
      "id": "100", 
      "diaplayName": "MyValue1", 
     }, 
     { 
      "id": "200", 
      "diaplayName": "MyValue2", 
     } 
    ]  
} 
+0

धन्यवाद। मैंने इस तरह की जेसन स्ट्रिंग को बदल दिया लेकिन फिर भी मुझे शून्य मान मिल रहे हैं। – niknowj

1

आपका डेटा संरचना कोशिश करते हैं और आपके JSON मेल नहीं खाते।

{ 
    "JsonValues":{ 
     "id": "MyID", 
     ... 
    } 
} 

लेकिन डेटा संरचना तुम कोशिश है करने के लिए इसे क्रमानुसार करने के लिए इस:

class ValueSet 
{ 
    [JsonProperty("id")] 
    public string id 
    { 
     get; 
     set; 
    } 
    ... 
} 

आप एक चरण को छोड़ने पर कर रहे हैं: आपका JSON एक वर्ग एक है कि

आपका JSON यह है संपत्ति JsonValues नामित है, जिसमें आपके ValueSet डेटा संरचना का मूल्य मान के रूप में है।

इसके अलावा अपने वर्ग के भीतर आपके JSON यह है:

"values": { ... } 

आपका डेटा संरचना यह है:

[JsonProperty("values")] 
public List<Value> values 
{ 
    get; 
    set; 
} 

ध्यान दें कि JSON में { .. } एक वस्तु है, जहां के रूप में [ .. ] एक सरणी को परिभाषित करता है परिभाषित करता है। तो आपके JSON के मुताबिक आपके पास मूल्यों का समूह नहीं है, लेकिन आपके पास गुण value1 और value2 प्रकार Value गुणों के साथ मूल्य वस्तु है।

चूंकि deserializer एक सरणी की अपेक्षा करता है लेकिन इसके बजाय एक ऑब्जेक्ट प्राप्त करता है, यह कम से कम विनाशकारी (अपवाद) चीज करता है जो यह कर सकता है: मान छोड़ें। आपकी संपत्ति values इसके डिफ़ॉल्ट मान के साथ बनी हुई है: null

यदि आप कर सकते हैं: अपने JSON समायोजित करें। निम्नलिखित अपने डेटा संरचना से मेल खाते हैं और सबसे अधिक संभावना क्या आप वास्तव में चाहते हैं जाएगा:

{ 
    "id": "MyID", 

    "values": [ 
     { 
      "id": "100", 
      "diaplayName": "MyValue1" 
     }, { 
      "id": "200", 
      "diaplayName": "MyValue2" 
     } 
    ] 
} 
+0

मैंने इस तरह जेसन संरचना बदल दी लेकिन फिर भी मुझे ऑब्जेक्ट – niknowj

+0

में शून्य मान मिल रहा है मैंने इसे अनदेखा किया। कृपया ध्यान दें कि आपके सी # में आपके पास 'डायप्लेनाम' है, लेकिन आपके JSON में आपके पास 'diaplayName' है। नाम केस-सेंसिटिव हैं। या तो अपनी संपत्ति का नाम सी #, जेएसओएन में बदलें या 'JsonPropertyAttribute' का उपयोग करें ताकि आप अपनी संपत्ति के JSON नाम को serializer बता सकें। – user2674389

+1

स्टैक ओवरफ्लो पर आपके त्रुटि विवरणों के साथ हमेशा यह अधिक सटीक होना बेहतर होगा। आपको ऑब्जेक्ट में 'शून्य मान' मिलते हैं - बिल्कुल शून्य क्या है? आपको पूरा वस्तु मिलती है? आपकी सूची? एक संपत्ति? कौन सी संपत्ति? जितना अधिक सटीक आप हैं, आसान लोग आपकी मदद कर सकते हैं (और शायद आप खुद को गलती भी देखते हैं)। – user2674389

-3

ऐसा करने के लिए Json.Net ढांचे का उपयोग कर सकते हैं। बस इस तरह:

Account account = JsonConvert.DeserializeObject<Account>(json);

मुख पृष्ठ: http://json.codeplex.com/

इस बारे में दस्तावेज: http://james.newtonking.com/json/help/index.html#

+1

वह पहले से ही Json.NET का उपयोग कर रहा है! – user2674389

0

आप इस लाइन पूरी तरह से काम करता है & अपने स्ट्रिंग की जाँच की थी उस में मूल्य है?

string jsonString = sr.ReadToEnd();

यदि हाँ, अंतिम पंक्ति के लिए इस कोड का प्रयास करें:

ValueSet items = JsonConvert.DeserializeObject<ValueSet>(jsonString);

या आप इस तरह की सूची का उपयोग कर सकते है अगर आप json की एक सरणी है:

List<ValueSet> items = JsonConvert.DeserializeObject<List<ValueSet>>(jsonString);

शुभकामनाएं

-1

यह भी संभव है:

using System.Web.Helpers; 
    var listOfObjectsResult = Json.Decode<List<DataType>>(JsonData); 
5

http://json2csharp.com/

मुझे उपरोक्त लिंक अविश्वसनीय रूप से सहायक पाया गया क्योंकि यह वास्तव में वापस लौटाए गए JSON से उत्पन्न करके मेरे सी # कक्षाओं को सही करता है।

तो मैं कहा जाता है:

JsonConvert.DeserializeObject<RootObject>(jsonString); 

और सब कुछ उम्मीद के रूप में काम किया।

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