/*------------------------------------------------------------------
|
-- 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
|
{
|
/// <summary>
|
/// json类库
|
/// </summary>
|
public class JsonHelper
|
{
|
/// <summary>
|
/// 实例化
|
/// </summary>
|
public JsonHelper()
|
{
|
}
|
|
#region 把DataTable数据,转化成JSON字符串
|
|
/// <summary>
|
/// 把DataTable数据,转化成JSON字符串
|
/// </summary>
|
/// <param name="jsonName">对象名称</param>
|
/// <param name="dt">DataTable数据集</param>
|
/// <returns>JSON数组字符串</returns>
|
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数组字符串
|
|
/// <summary>
|
/// 把LIST数据对象,转化成JSON数组字符串
|
/// </summary>
|
/// <typeparam name="IL">对象集合</typeparam>
|
/// <param name="jsonName">JSON名称</param>
|
/// <returns>JSON数组字符串</returns>
|
public static string IListToJson<T>(string jsonName, IList<T> 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<T>();
|
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可识别用
|
|
/// <summary>
|
/// 把LIST数据对象,转化成JSON数组字符串 与IListToJson不同在于方法中返回总数用total,直接datagrid可识别
|
/// </summary>
|
/// <typeparam name="IL">对象集合</typeparam>
|
/// <param name="jsonName">JSON名称</param>
|
/// <returns>JSON数组字符串</returns>
|
/// <history>[HanHe(谢大磊)] CREATED 2017/9/6</history>
|
public static string IListToJsonNew<T>(string jsonName, IList<T> 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<T>();
|
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 字符串
|
|
/// <summary>
|
/// 把对象序列化 JSON 字符串
|
/// </summary>
|
/// <typeparam name="T">对象类型</typeparam>
|
/// <param name="obj">对象实体</param>
|
/// <returns>JSON字符串</returns>
|
public static string GetJson<T>(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字符串还原为对象
|
|
/// <summary>
|
/// 把JSON字符串还原为对象
|
/// </summary>
|
/// <typeparam name="T">对象类型</typeparam>
|
/// <param name="szJson">JSON字符串</param>
|
/// <returns>对象实体</returns>
|
public static T ParseFormJson<T>(string szJson)
|
{
|
T obj = Activator.CreateInstance<T>();
|
using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(szJson)))
|
{
|
|
DataContractJsonSerializer dcj = new DataContractJsonSerializer(typeof (T));
|
|
return (T) dcj.ReadObject(ms);
|
|
|
}
|
}
|
|
#endregion
|
|
#region 将JSON字符串转换成对象集合
|
|
/// <summary>
|
/// 将JSON字符串转换成对象集合
|
/// </summary>
|
/// <typeparam name="T"></typeparam>
|
/// <param name="JsonStr"></param>
|
/// <returns></returns>
|
public static List<T> JSONStringToList<T>(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<T> objs = Serializer.Deserialize<List<T>>(JsonStr);
|
return objs;
|
}
|
|
#endregion
|
|
#region 将Model对象转换成JsonString
|
|
public static string ModelToJsonString<T>(T model)
|
{
|
|
JavaScriptSerializer serializer = new JavaScriptSerializer();
|
serializer.MaxJsonLength = int.MaxValue;
|
return serializer.Serialize(model);
|
}
|
|
#endregion
|
|
/// <summary>
|
/// 将Json序列化的时间由/Date(1294499956278+0800)转为字符串
|
/// </summary>
|
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;
|
}
|
|
/// <summary>
|
/// 将时间字符串转为Json时间
|
/// </summary>
|
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;
|
}
|
|
/// <summary>
|
/// 将时间字符串转为Json时间
|
/// </summary>
|
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;
|
}
|
|
/// <summary>
|
/// 是否为日期+时间型字符串
|
/// </summary>
|
/// <param name="source"></param>
|
/// <returns></returns>
|
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)$ ");
|
}
|
|
|
}
|
}
|