2013-08-14 3 views
27

Я новичок в работе с данными JSON.Как десериализовать данные JSON?

Я читаю данные из веб-службы. Данные запроса, отправленные обратно следующее:

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

Вы можете легко отрепетировать это. Структура данных в C# равна только List<string[]>, поэтому вы можете просто сделать это;

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

Приведенный выше код предполагает, что вы используете json.NET.

EDIT: Обратите внимание, что json представляет собой массив массивов строк. Я предпочитаю использовать List<string[]> для моей собственной декларации, потому что это более интуитивно понятное. Это не вызовет никаких проблем для json.NET, если вы хотите, чтобы это был массив массивов строк, тогда вам нужно изменить тип на (я думаю) string[][], но есть несколько забавных маленьких масок с зубчатыми и двумерными массивами в C# что я действительно не знаю, поэтому я просто не беспокоюсь об этом.

0

Шаг 1: Перейдите на json.org, чтобы найти библиотеку JSON для любой технологии, которую вы используете, для вызова этой веб-службы. Загрузите и перейдите к этой библиотеке.

Шаг 2: Предположим, вы используете Java. Вы могли бы использовать 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

При использовании .Net 4.5 вы также можете использовать стандартный .Net JSon сериалайзер:

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

В .Net 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; 
    } 
} 
Смежные вопросы