2013-08-14 12 views
27

मैं JSON डेटा के साथ काम करने के लिए नया हूं।JSON डेटा को Deserialize कैसे करें?

मैं एक वेब सेवा से डेटा पढ़ रहा हूं।

[["B02001_001E","NAME","state"], 
["4712651","Alabama","01"], 
["691189","Alaska","02"], 
["6246816","Arizona","04"], 
["18511620","Florida","12"], 
["9468815","Georgia","13"], 
["1333591","Hawaii","15"], 
["1526797","Idaho","16"], 
["3762322","Puerto Rico","72"]] 

वहाँ मेरे बिना पहले परिभाषित करने क्या वस्तु की तरह है इस तरह से इस डेटा deserialize करने के लिए है कि आधार वस्तु उत्पन्न हो जाएगा एक रास्ता है: क्वेरी वापस भेज दिया डेटा पीछा कर रहा है? ऊपर के उदाहरण में वस्तु पहली पंक्ति से परिभाषित किया गया है:

  ["B02001_001E","NAME","state"], 

सामान्य में वेब सेवा जो दो आयामी JSON सारणी जहां पहली पंक्ति स्तंभ नाम और बाद पंक्तियों प्रदान करता है के रूप में स्वरूपित क्वेरी डेटा वापस आ जाएगी डेटा मान प्रदान करते हैं ।

उत्तर

43

आप इसे वास्तव में आसानी से deserialize कर सकते हैं। सी # में डेटा की संरचना सिर्फ List<string[]> है ताकि आप बस कर सकें;

List<string[]> data = JsonConvert.DeserializeObject<List<string[]>>(jsonString); 

उपर्युक्त कोड यह मान रहा है कि आप json.NET का उपयोग कर रहे हैं।

संपादित करें: ध्यान दें कि जेसन तकनीकी रूप से स्ट्रिंग सरणी का सरणी है। मैं अपनी घोषणा के लिए List<string[]> का उपयोग करना पसंद करता हूं क्योंकि यह आईएमओ अधिक सहज है। यह json.NET के लिए कोई समस्या नहीं पैदा करेगा, अगर आप इसे स्ट्रिंग एरेज़ की सरणी बनाना चाहते हैं तो आपको टाइप को (मुझे लगता है) string[][] में बदलने की जरूरत है, लेकिन कुछ मजाकिया छोटे गॉचा के साथ जंजीर और 2 डी एरे में सी # कि मुझे वास्तव में पता नहीं है इसलिए मैं यहां इससे निपटने से परेशान नहीं हूं।

0

चरण 1: इस वेब सेवा को कॉल करने के लिए आप जिस भी तकनीक का उपयोग कर रहे हैं, उसके लिए JSON लाइब्रेरी ढूंढने के लिए json.org पर जाएं। उस पुस्तकालय को डाउनलोड करें और लिंक करें।

चरण 2: मान लीजिए कि आप जावा का उपयोग कर रहे हैं। आप JSONArray इस तरह का प्रयोग करेंगे:

JSONArray myArray=new JSONArray(queryResponse); 
for (int i=0;i<myArray.length;i++){ 
    JSONArray myInteriorArray=myArray.getJSONArray(i); 
    if (i==0) { 
     //this is the first one and is special because it holds the name of the query. 
    }else{ 
     //do your stuff 
     String stateCode=myInteriorArray.getString(0); 
     String stateName=myInteriorArray.getString(1); 
    } 
} 
29

आप नेट 4.5 का उपयोग करते हैं तो आप भी मानक नेट json serializer उपयोग कर सकते हैं:

using System.Runtime.Serialization.Json; 
...  
Stream jsonSource = ...; // serializer will read data stream 
var s = new DataContractJsonSerializer(typeof(string[][])); 
var j = (string[][])s.ReadObject(jsonSource); 

नेट 4.5 में और पुराने आप JavaScriptSerializer वर्ग का उपयोग कर सकते हैं:

using System.Web.Script.Serialization; 
... 
JavaScriptSerializer serializer = new JavaScriptSerializer(); 
string[][] list = serializer.Deserialize<string[][]>(json); 
0

आप अपना स्वयं का JSON पार्सर लिख सकते हैं और अपनी आवश्यकता के आधार पर इसे अधिक सामान्य बना सकते हैं। यहां एक ऐसा है जो मेरे उद्देश्य को अच्छी तरह से सेवा देता है, आशा भी आपकी मदद करेगी।

class JsonParsor 
{ 
    public static DataTable JsonParse(String rawJson) 
    { 
     DataTable dataTable = new DataTable(); 
     Dictionary<string, string> outdict = new Dictionary<string, string>(); 
     StringBuilder keybufferbuilder = new StringBuilder(); 
     StringBuilder valuebufferbuilder = new StringBuilder(); 
     StringReader bufferreader = new StringReader(rawJson); 
     int s = 0; 
     bool reading = false; 
     bool inside_string = false; 
     bool reading_value = false; 
     bool reading_number = false; 
     while (s >= 0) 
     { 
      s = bufferreader.Read(); 
      //open JSON 
      if (!reading) 
      { 
       if ((char)s == '{' && !inside_string && !reading) 
       { 
        reading = true; 
        continue; 
       } 
       if ((char)s == '}' && !inside_string && !reading) 
        break; 
       if ((char)s == ']' && !inside_string && !reading) 
        continue; 
       if ((char)s == ',') 
        continue; 
      } 
      else 
      { 
       if (reading_value) 
       { 
        if (!inside_string && (char)s >= '0' && (char)s <= '9') 
        { 
         reading_number = true; 
         valuebufferbuilder.Append((char)s); 
         continue; 
        } 
       } 
       //if we find a quote and we are not yet inside a string, advance and get inside 
       if (!inside_string) 
       { 
        if ((char)s == '\"' && !inside_string) 
         inside_string = true; 
        if ((char)s == '[' && !inside_string) 
        { 
         keybufferbuilder.Length = 0; 
         valuebufferbuilder.Length = 0; 
           reading = false; 
           inside_string = false; 
           reading_value = false; 
        } 
        if ((char)s == ',' && !inside_string && reading_number) 
        { 
         if (!dataTable.Columns.Contains(keybufferbuilder.ToString())) 
          dataTable.Columns.Add(keybufferbuilder.ToString(), typeof(string)); 
         if (!outdict.ContainsKey(keybufferbuilder.ToString())) 
          outdict.Add(keybufferbuilder.ToString(), valuebufferbuilder.ToString()); 
         keybufferbuilder.Length = 0; 
         valuebufferbuilder.Length = 0; 
         reading_value = false; 
         reading_number = false; 
        } 
        continue; 
       } 

       //if we reach end of the string 
       if (inside_string) 
       { 
        if ((char)s == '\"') 
        { 
         inside_string = false; 
         s = bufferreader.Read(); 
         if ((char)s == ':') 
         { 
          reading_value = true; 
          continue; 
         } 
         if (reading_value && (char)s == ',') 
         { 
          //put the key-value pair into dictionary 
          if(!dataTable.Columns.Contains(keybufferbuilder.ToString())) 
           dataTable.Columns.Add(keybufferbuilder.ToString(),typeof(string)); 
          if (!outdict.ContainsKey(keybufferbuilder.ToString())) 
          outdict.Add(keybufferbuilder.ToString(), valuebufferbuilder.ToString()); 
          keybufferbuilder.Length = 0; 
          valuebufferbuilder.Length = 0; 
          reading_value = false; 
         } 
         if (reading_value && (char)s == '}') 
         { 
          if (!dataTable.Columns.Contains(keybufferbuilder.ToString())) 
           dataTable.Columns.Add(keybufferbuilder.ToString(), typeof(string)); 
          if (!outdict.ContainsKey(keybufferbuilder.ToString())) 
           outdict.Add(keybufferbuilder.ToString(), valuebufferbuilder.ToString()); 
          ICollection key = outdict.Keys; 
          DataRow newrow = dataTable.NewRow(); 
          foreach (string k_loopVariable in key) 
          { 
           CommonModule.LogTheMessage(outdict[k_loopVariable],"","",""); 
           newrow[k_loopVariable] = outdict[k_loopVariable]; 
          } 
          dataTable.Rows.Add(newrow); 
          CommonModule.LogTheMessage(dataTable.Rows.Count.ToString(), "", "row_count", ""); 
          outdict.Clear(); 
          keybufferbuilder.Length=0; 
          valuebufferbuilder.Length=0; 
          reading_value = false; 
          reading = false; 
          continue; 
         } 
        } 
        else 
        { 
         if (reading_value) 
         { 
          valuebufferbuilder.Append((char)s); 
          continue; 
         } 
         else 
         { 
          keybufferbuilder.Append((char)s); 
          continue; 
         } 
        } 
       } 
       else 
       { 
        switch ((char)s) 
        { 
         case ':': 
          reading_value = true; 
          break; 
         default: 
          if (reading_value) 
          { 
           valuebufferbuilder.Append((char)s); 
          } 
          else 
          { 
           keybufferbuilder.Append((char)s); 
          } 
          break; 
        } 
       } 
      } 
     } 

     return dataTable; 
    } 
} 
संबंधित मुद्दे