1.背景
项目中需要动态解析json字符串,并且转换为datatable。
牵扯到Newtonsoft.Json.dll的使用(JsonConvert类)以及System.Web.Script.Serialization下JavaScriptSerializer的使用。
2.代码
(1)最通用的方法(无论是否知道成员变量或者key值),使用JavaScriptSerializer类
DataTable dataTable = new DataTable(); //实例化
DataTable result;
try
{
JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
javaScriptSerializer.MaxJsonLength = Int32.MaxValue; //取得最大数值
ArrayList arrayList = javaScriptSerializer.Deserialize<ArrayList>(json);
if (arrayList.Count > 0)
{
foreach (Dictionary<string, object> dictionary in arrayList)
{
if (dictionary.Keys.Count<string>() == 0)
{
result = dataTable;
return result;
}
//在第一次循环时确定datatable的列名,后续循环无需再更改
if (dataTable.Columns.Count == 0)
{
//此处仅考虑一层json字符串的形式,多层结构需要深入得到叶子节点的key
foreach (string current in dictionary.Keys)
{
dataTable.Columns.Add(current, dictionary[current].GetType());
}
}
//每次循环增加datatable的Rows
DataRow dataRow = dataTable.NewRow();
foreach (string current in dictionary.Keys)
{
dataRow[current] = dictionary[current];
}
dataTable.Rows.Add(dataRow); //循环添加行到DataTable中
}
}
}
catch
{
}
result = dataTable;
return result;
(2)在已经知道成员变量的情况下(即得到datatable的列名),只需遍历得到key所对应的value值即可。引用Newtonsoft.Json
可使用Jobject对象,示例如下所示:
JObject jo = JObject.Parse(inputJsonString);
string process_id = jo["process_id"].ToString();
string node_id = jo["node_id"].ToString();
string fileName = jo["fileName"].ToString();
(3)最简单的! DataTable dt=JsonConvert.DeserializeObject<DataTable>(string);
注意只适合简单的json形式,即一层键值对的形式,无嵌套结构
3.备注
(1)Newtonsoft.Json.dll 主要是用来进行json字符串的反序列化和对象的反序列化,使用起来非常方便。
其中,字符串反序列化得到类型T,或者集合T 反之亦然 是最为常用的
(2)在代码1中,使用JavaScriptSerializer进行反序列化,得到ArrayList对象,进而得到多个映射对。那是否在此处可以使用JsonConvert进行反序列化得到ArrayList呢,那是当然的。但是!接下来就无法进行了,arrayList再往下解析并非是map映射对。
(3)“单层”json 使用最简单的方法一句话完事儿即可 其他复杂json情况,可以使用通用的方法。