/*------------------------------------------------------------------
-- COPYRIGHT (C) 2011-2020 hanhe
-- ALL RIGHTS RESERVED.
-- han he
-- CREATE DATE: 2014/06/27
-- CREATE MAN: 姜新军
-- 对象与JSON字符串互相转化类
-- MODIFY HISTORY:
-- MODIFY DATE:
-- MODIFY MAN:
-- MODIFY DESC:
-- MODIFY DATE:
-- MODIFY MAN:
-- MODIFY DESC:
---------------------------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;
using System.Text;
using System.Runtime.Serialization.Json;
using System.Reflection;
using System.Data;
using System.Text.RegularExpressions;///记得引用这个命名空间
using System.Web.Script.Serialization;
using System.Runtime.Serialization.Json;
namespace HH.AutoBom.Utils.Common
{
///
/// json类库
///
public class JsonHelper
{
///
/// 实例化
///
public JsonHelper()
{
}
#region 把DataTable数据,转化成JSON字符串
///
/// 把DataTable数据,转化成JSON字符串
///
/// 对象名称
/// DataTable数据集
/// JSON数组字符串
public static string DataTableToJson(string jsonName, DataTable dt)
{
StringBuilder Json = new StringBuilder();
Json.Append("{\"" + jsonName + "\":[");
if (dt.Rows.Count > 0)
{
for (int i = 0; i < dt.Rows.Count; i++)
{
Json.Append("{");
for (int j = 0; j < dt.Columns.Count; j++)
{
Json.Append("\"" + dt.Columns[j].ColumnName.ToString() + "\":\"" + dt.Rows[i][j].ToString() +
"\"");
if (j < dt.Columns.Count - 1)
{
Json.Append(",");
}
}
Json.Append("}");
if (i < dt.Rows.Count - 1)
{
Json.Append(",");
}
}
}
Json.Append("]}");
return Json.ToString();
}
#endregion
#region 把LIST数据对象,转化成JSON数组字符串
///
/// 把LIST数据对象,转化成JSON数组字符串
///
/// 对象集合
/// JSON名称
/// JSON数组字符串
public static string IListToJson(string jsonName, IList IL, long totalRows)
{
StringBuilder Json = new StringBuilder();
if (!string.IsNullOrEmpty(jsonName))
{
Json.Append("{\"" + jsonName + "\":[");
}
else
{
Json.Append("[");
}
if (IL.Count > 0)
{
for (int i = 0; i < IL.Count; i++)
{
T obj = Activator.CreateInstance();
Type type = obj.GetType();
PropertyInfo[] pis = type.GetProperties();
Json.Append("{");
for (int j = 0; j < pis.Length; j++)
{
object value = pis[j].GetValue(IL[i], null);
//处理日期类型
if (Util.IsTDateTime(value))
{
//格式化日期
value = Util.ToString(Convert.ToDateTime(value), "yyyy-MM-dd HH:mm:ss");
//格式化成JSON日期。
string pattern = @"\\/Date\((\d+)\+\d+\)\\/";
MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString);
Regex reg = new Regex(pattern);
value = reg.Replace(value.ToString(), matchEvaluator);
// value = ConvertDateStringToJsonDate(value.ToString());
}
Json.Append("\"" + pis[j].Name.ToString() + "\":\"" + value + "\"");
if (j < pis.Length - 1)
{
Json.Append(",");
}
}
Json.Append("}");
if (i < IL.Count - 1)
{
Json.Append(",");
}
}
}
if (!string.IsNullOrEmpty(jsonName))
{
if (totalRows > 0)
{
Json.Append("],\"totalRows\":\"" + totalRows + "\"}");
}
else
{
Json.Append("]}");
}
}
else
{
Json.Append("]");
}
return Json.ToString();
}
#endregion
#region 把LIST数据对象,转化成JSON数组字符串 主要用于datagrid可识别用
///
/// 把LIST数据对象,转化成JSON数组字符串 与IListToJson不同在于方法中返回总数用total,直接datagrid可识别
///
/// 对象集合
/// JSON名称
/// JSON数组字符串
/// [HanHe(谢大磊)] CREATED 2017/9/6
public static string IListToJsonNew(string jsonName, IList IL, long totalRows)
{
StringBuilder Json = new StringBuilder();
if (!string.IsNullOrEmpty(jsonName))
{
Json.Append("{\"" + jsonName + "\":[");
}
else
{
Json.Append("[");
}
if (IL.Count > 0)
{
for (int i = 0; i < IL.Count; i++)
{
T obj = Activator.CreateInstance();
Type type = obj.GetType();
PropertyInfo[] pis = type.GetProperties();
Json.Append("{");
for (int j = 0; j < pis.Length; j++)
{
object value = pis[j].GetValue(IL[i], null);
//处理日期类型
if (Util.IsTDateTime(value))
{
//格式化日期
value = Util.ToString(Convert.ToDateTime(value), "yyyy-MM-dd HH:mm:ss");
//格式化成JSON日期。
string pattern = @"\\/Date\((\d+)\+\d+\)\\/";
MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString);
Regex reg = new Regex(pattern);
value = reg.Replace(value.ToString(), matchEvaluator);
// value = ConvertDateStringToJsonDate(value.ToString());
}
Json.Append("\"" + pis[j].Name.ToString() + "\":\"" + value + "\"");
if (j < pis.Length - 1)
{
Json.Append(",");
}
}
Json.Append("}");
if (i < IL.Count - 1)
{
Json.Append(",");
}
}
}
if (!string.IsNullOrEmpty(jsonName))
{
if (totalRows > 0)
{
Json.Append("],\"total\":\"" + totalRows + "\"}");
}
else
{
Json.Append("]}");
}
}
else
{
Json.Append("]");
}
return Json.ToString();
}
#endregion
#region 把对象序列化 JSON 字符串
///
/// 把对象序列化 JSON 字符串
///
/// 对象类型
/// 对象实体
/// JSON字符串
public static string GetJson(T obj)
{
//记住 添加引用 System.ServiceModel.Web
/**
* 如果不添加上面的引用,System.Runtime.Serialization.Json; Json是出不来的哦
* */
DataContractJsonSerializer json = new DataContractJsonSerializer(typeof (T));
using (MemoryStream ms = new MemoryStream())
{
json.WriteObject(ms, obj);
string szJson = Encoding.UTF8.GetString(ms.ToArray());
return szJson;
}
}
#endregion
#region 把JSON字符串还原为对象
///
/// 把JSON字符串还原为对象
///
/// 对象类型
/// JSON字符串
/// 对象实体
public static T ParseFormJson(string szJson)
{
T obj = Activator.CreateInstance();
using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(szJson)))
{
DataContractJsonSerializer dcj = new DataContractJsonSerializer(typeof (T));
return (T) dcj.ReadObject(ms);
}
}
#endregion
#region 将JSON字符串转换成对象集合
///
/// 将JSON字符串转换成对象集合
///
///
///
///
public static List JSONStringToList(string JsonStr)
{
string pattern = @"\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}";
MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertDateStringToJsonDate);
Regex reg = new Regex(pattern);
JsonStr = reg.Replace(JsonStr, matchEvaluator);
JavaScriptSerializer Serializer = new JavaScriptSerializer();
List objs = Serializer.Deserialize>(JsonStr);
return objs;
}
#endregion
#region 将Model对象转换成JsonString
public static string ModelToJsonString(T model)
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
serializer.MaxJsonLength = int.MaxValue;
return serializer.Serialize(model);
}
#endregion
///
/// 将Json序列化的时间由/Date(1294499956278+0800)转为字符串
///
private static string ConvertJsonDateToDateString(Match m)
{
string result = string.Empty;
DateTime dt = new DateTime(1970, 1, 1);
dt = dt.AddMilliseconds(long.Parse(m.Groups[1].Value));
dt = dt.ToLocalTime();
result = dt.ToString("yyyy-MM-dd HH:mm:ss");
return result;
}
///
/// 将时间字符串转为Json时间
///
private static string ConvertDateStringToJsonDate(Match m)
{
string result = string.Empty;
DateTime dt = DateTime.Parse(m.Groups[0].Value);
dt = dt.ToUniversalTime();
TimeSpan ts = dt - DateTime.Parse("1970-01-01");
result = string.Format("\\/Date({0}+0800)\\/", ts.TotalMilliseconds);
return result;
}
///
/// 将时间字符串转为Json时间
///
private static string ConvertDateStringToJsonDate(string DateTime)
{
string result = string.Empty;
DateTime dt = Convert.ToDateTime(DateTime);
dt = dt.ToUniversalTime();
TimeSpan ts = dt - Convert.ToDateTime("1970-01-01");
result = string.Format("/Date({0}+0800)/", ts.TotalMilliseconds);
return result;
}
///
/// 是否为日期+时间型字符串
///
///
///
public static bool IsTDateTime(string StrSource)
{
return Regex.IsMatch(StrSource,
@"^(((((1[6-9]|[2-9]d)d{2})-(0?|1)-(0?[1-9]|d|3))|(((1[6-9]|[2-9]d)d{2})-(0?|1)-(0?[1-9]|d|30))|(((1[6-9]|[2-9]d)d{2})-0?2-(0?[1-9]|1d|2[0-8]))|(((1[6-9]|[2-9]d)(0||)|((16||)00))-0?2-29-)) (20|21|22|23|[0-1]?d):[0-5]?d:[0-5]?d)$ ");
}
}
}