/******************************
* 说明: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] + "";
}
}
}