/****************************** * 说明:Json相关操作 * 创建人:龚宇超 * 创建日期:2017-10-23 * 修改人: * 修改日期: * 修改备注: * 版本:1.0.0.0 ******************************/ using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Text; using System.Data; using System.Web.Script.Serialization; using System.Collections; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace Lskj.Util { /// /// Json 相关操作 /// public static class JsonUtil { /// /// Json 字符串 转换为 DataTable数据集合 /// /// /// public static DataTable ToComplexTable(string json) { DataTable dataTable = new DataTable(); //实例化 DataTable result; try { JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer(); javaScriptSerializer.MaxJsonLength = Int32.MaxValue; //取得最大数值 ArrayList arrayList = javaScriptSerializer.Deserialize(json); if (arrayList.Count > 0) { foreach (Dictionary dictionary in arrayList) { if (dictionary.Keys.Count() == 0) { result = dataTable; return result; } //Columns if (dataTable.Columns.Count == 0) { foreach (string current in dictionary.Keys) { if (current != "data") dataTable.Columns.Add(current, dictionary[current].GetType()); else { ArrayList list = dictionary[current] as ArrayList; foreach (Dictionary dic in list) { foreach (string key in dic.Keys) { dataTable.Columns.Add(key, dic[key].GetType()); } break; } } } } //Rows string root = ""; foreach (string current in dictionary.Keys) { if (current != "data") root = current; else { ArrayList list = dictionary[current] as ArrayList; foreach (Dictionary dic in list) { DataRow dataRow = dataTable.NewRow(); dataRow[root] = dictionary[root]; foreach (string key in dic.Keys) { dataRow[key] = dic[key]; } dataTable.Rows.Add(dataRow); } } } } } } catch { } result = dataTable; return result; } /// /// 说明:json 字符串转换为DataTable /// 创建人:龚宇超 /// 创建日期:2017-10-23 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The json. /// DataTable. public static DataTable ToDataTable(this string json) { int interception = json.LastIndexOf(']'); json = json.Substring(0, interception + 1); DataTable dataTable = new DataTable(); //实例化 DataTable result; try { JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer(); javaScriptSerializer.MaxJsonLength = Int32.MaxValue; //取得最大数值 ArrayList arrayList = javaScriptSerializer.Deserialize(json); if (arrayList != null && arrayList.Count > 0) { foreach (Dictionary dictionary in arrayList) { if (dictionary.Keys.Count() == 0) { result = dataTable; return result; } if (dataTable.Columns.Count == 0) { foreach (string current in dictionary.Keys) { dataTable.Columns.Add(current, dictionary[current].GetType()); } } DataRow dataRow = dataTable.NewRow(); foreach (string current in dictionary.Keys) { dataRow[current] = dictionary[current]; } dataTable.Rows.Add(dataRow); //循环添加行到DataTable中 } } } catch (Exception ex) { } result = dataTable; return result; } /// /// 说明:将可能包含对象或数组字段的网页行 JSON 转换为 DataTable /// 复杂字段所在列统一保留为字符串,纯标量列保持现有类型推断 /// /// 顶层对象或对象数组 JSON /// DataTable. public static DataTable ToDataTablePreservingComplexValues(string json) { if (string.IsNullOrWhiteSpace(json)) { throw new ArgumentException("网页行 JSON 不能为空。", "json"); } JToken root = JToken.Parse(json); JArray rows; if (root.Type == JTokenType.Array) { rows = (JArray)root; } else if (root.Type == JTokenType.Object) { rows = new JArray(root); } else { throw new JsonSerializationException("网页行 JSON 的顶层必须是对象或对象数组。"); } HashSet complexColumns = new HashSet(StringComparer.OrdinalIgnoreCase); foreach (JToken rowToken in rows) { if (rowToken.Type != JTokenType.Object) { throw new JsonSerializationException("网页行 JSON 数组中的每一项都必须是对象。"); } foreach (JProperty property in ((JObject)rowToken).Properties()) { if (property.Value.Type == JTokenType.Object || property.Value.Type == JTokenType.Array) { complexColumns.Add(property.Name); } } } foreach (JObject row in rows.Children()) { foreach (JProperty property in row.Properties().ToList()) { if (!complexColumns.Contains(property.Name) || property.Value.Type == JTokenType.Null || property.Value.Type == JTokenType.Undefined) { continue; } string text; if (property.Value.Type == JTokenType.Object || property.Value.Type == JTokenType.Array) { text = property.Value.ToString(Formatting.None); } else if (property.Value.Type == JTokenType.String) { text = property.Value.Value(); } else { JValue scalar = property.Value as JValue; text = scalar == null || scalar.Value == null ? null : Convert.ToString(scalar.Value, CultureInfo.InvariantCulture); } property.Value = text == null ? JValue.CreateNull() : new JValue(text); } } return JsonConvert.DeserializeObject(rows.ToString(Formatting.None)); } /// /// 说明: /// 创建人:龚宇超 /// 创建日期:2017-10-23 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The json. /// DataRow. public static DataRow ToDataRow(this string json) { if (string.IsNullOrWhiteSpace(json)) return null; JObject rowObject = JsonConvert.DeserializeObject(json); JArray jArray = new JArray(); jArray.Add(rowObject); DataTable table = JsonConvert.DeserializeObject(JsonConvert.SerializeObject(jArray)); return table != null && table.Rows.Count > 0 ? table.Rows[0] : null; } /// /// 说明:DataTable To JsonArray /// 创建人:龚宇超 /// 创建日期:2017-10-23 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The dt table. /// System.String. public static string ToJsonArray(this DataTable dtTable) { JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer(); javaScriptSerializer.MaxJsonLength = Int32.MaxValue; //取得最大数值 ArrayList arrayList = new ArrayList(); foreach (DataRow dataRow in dtTable.Rows) { Dictionary dictionary = new Dictionary(); //实例化一个参数集合 foreach (DataColumn dataColumn in dtTable.Columns) { dictionary.Add(dataColumn.ColumnName, dataRow[dataColumn.ColumnName].ToStr()); } arrayList.Add(dictionary); //ArrayList集合中添加键值 } return javaScriptSerializer.Serialize(arrayList); //返回一个json字符串 } /// /// 说明:DataRow To Json /// 创建人:龚宇超 /// 创建日期:2017-10-23 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The row. /// System.String. public static string ToJsonObject(this DataRow row) { DataTable dataTable = row.Table.Clone(); DataRow dataRow = dataTable.NewRow(); dataRow.ItemArray = row.ItemArray; dataTable.Rows.Add(dataRow); JArray jArray = JsonConvert.DeserializeObject(JsonConvert.SerializeObject(dataTable)); return jArray[0] + ""; } } }