如何反序列化JSON数据?
我是使用JSON数据的新手。
我正在从Web服务读取数据。 发回的查询数据如下:
[["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"]]
有没有一种方法来反序列化这种数据的方式,基础对象将会在没有我的情况下首先定义对象是什么样子? 在上面的例子中,对象由第一行定义:
["B02001_001E","NAME","state"],
通常,Web服务将返回格式为二维JSON数组的查询数据,其中第一行提供列名称,后续行提供数据值。
你可以反序列化这真的很容易。 C#中的数据结构就是List<string[]>
所以你可以做;
List<string[]> data = JsonConvert.DeserializeObject<List<string[]>>(jsonString);
上面的代码假设你正在使用json.NET。
编辑:注意JSON技术上是一个string数组的数组。 我更喜欢使用List<string[]>
作为我自己的声明,因为它更直观。 它不会导致json.NET的任何问题,如果你想它是一个string数组的数组,那么你需要改变types(我认为) string[][]
但有一些有趣的小窍门锯齿状在C#中的二维数组,我真的不知道,所以我只是不打扰在这里处理。
如果您使用.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);
第1步:转到json.org查找用于调用此Web服务的任何技术的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); } }
您可以编写自己的JSONparsing器,并根据您的要求使其更通用。 这是一个很好的服务我的目的,希望也会帮助你。
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; } }