c# .net json字符串在未知实体情况下正确转换为datatable

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情况,可以使用通用的方法。

猜你喜欢

转载自blog.csdn.net/miluli1/article/details/85707116