2013-08-14 23 views
27

JSON verileriyle çalışmaya başladım.JSON verilerini nasıl desiteleyebilirim?

Web hizmetinden veri okuyorum.

[["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"]] 

beni ilk nesne nasıl bir şey olduğunu tanımlamadan temel nesne oluşturulur şekilde bu verileri Deserialize bir yolu var mı: geri gönderilen sorgu verileri aşağıdaki mı? Yukarıdaki örnekte nesne ilk satır ile tanımlanır: Genel olarak

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

ilk satır, sütun adları ve sonraki satır sağlayan iki boyutlu bir JSON dizi olarak biçimlendirilmiş sorgulama verileri döndürür web hizmeti veri değerlerini sağlamak .

cevap

43

Bunu kolayca basitleştirebilirsiniz. Verilerin C# içindeki yapısı sadece List<string[]>'dur, böylece yapmanız yeterlidir;

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

Yukarıdaki kod, json.NET kullandığınızı varsayar.

DÜZENLEME: Json'un teknik olarak bir dizi dizi dizisi olduğunu unutmayın. Kendi beyanım için List<string[]> kullanmayı tercih ederim çünkü daha sezgisel. Json.NET için herhangi bir soruna neden olmaz, eğer bir dizi diziler dizisi olmasını istiyorsanız, (I think) tipini string[][] olarak değiştirmelisiniz, fakat C# ile pürüzlü ve 2 boyutlu dizilerle bazı komik küçük gotcha'lar var. Gerçekten bilmediğim için burada uğraşmaktan çekinmiyorum.

0

1. Adım: Bu web hizmetini çağırmak için kullandığınız teknoloji için JSON kitaplığını bulmak üzere json.org adresine gidin. İndir ve kütüphaneye bağla.

Adım 2: Java kullanacağınızı varsayalım. Böyle JSONArray kullanırsınız: .NET 4.5 olarak

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

ve üstü Eğer JavaScriptSerializer sınıfını kullanabilirsiniz: Eğer .NET 4.5 kullanıyorsanız

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

ayrıca standart Net json serileştirici kullanabilirsiniz

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

Kendi JSON ayrıştırıcınızı yazabilir ve gereksiniminize göre daha genel yapabilirsiniz. Amacım güzelce hizmet ettiğim bir şey, umarım size de yardımcı olur.

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; 
    } 
}