using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.Serialization.Json;
using System.Security.Cryptography;
using System.Text;
using System.Web;
using System.Web.Script.Serialization;
namespace WebService.SDK
{
public class JSonHelper
{
///
/// DataSet转换为Json
///
/// DataSet对象
/// Json字符串
public static string DataSetToJson(DataSet dataSet)
{
string jsonString = "{";
foreach (DataTable table in dataSet.Tables)
{
jsonString += "\"" + table.TableName + "\":" + DataTableToJson(table, table.TableName) + ",";
}
jsonString = jsonString.TrimEnd(',');
return jsonString + "}";
}
///
/// DataSet转换为Json
///
/// DataSet对象
/// Json字符串
public static string DataSetToJsons(DataSet dataSet)
{
string jsonString = "{";
foreach (DataTable table in dataSet.Tables)
{
jsonString += "\"" + table.TableName + "\":" + DataTableToJson(table) + ",";
}
jsonString = jsonString.TrimEnd(',');
return jsonString + "}";
}
public static string ArrayToJson(string[] strs)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < strs.Length; i++)
{
sb.AppendFormat("'{0}':'{1}',", i + 1, strs[i]);
}
if (sb.Length > 0)
{
return ("{" + sb.ToString().TrimEnd(new char[] { ',' }) + "}");
}
return "";
}
public static string ArrayToJson(List list, string propertyname)
{
StringBuilder sb = new StringBuilder();
if (list.Count > 0)
{
sb.Append("[{\"");
sb.Append(propertyname);
sb.Append("\":[");
foreach (T t in list)
{
sb.Append("\"");
sb.Append(t.ToString());
sb.Append("\",");
}
return (sb.ToString().TrimEnd(new char[] { ',' }) + "]}]");
}
return "";
}
public static string DataRowToJson(DataRow dr)
{
StringBuilder sb = new StringBuilder();
sb.Append("{");
foreach (DataColumn dc in dr.Table.Columns)
{
sb.Append("\"");
sb.Append(dc.ColumnName);
sb.Append("\":\"");
if (((dr[dc] != null) && (dr[dc] != DBNull.Value)) && (dr[dc].ToString() != ""))
{
sb.Append(dr[dc]);
}
else
{
sb.Append(" ");
}
sb.Append("\",");
}
sb = sb.Remove(0, sb.Length - 1);
sb.Append("},");
return sb.ToString();
}
///
/// Datatable转换为Json
///
/// Datatable对象
/// Json字符串
public static string DataTableToJson(DataTable dt)
{
StringBuilder jsonString = new StringBuilder();
jsonString.Append("[");
DataRowCollection drc = dt.Rows;
for (int i = 0; i < drc.Count; i++)
{
jsonString.Append("{");
for (int j = 0; j < dt.Columns.Count; j++)
{
string strKey = dt.Columns[j].ColumnName;
string strValue = drc[i][j].ToString();
Type type = dt.Columns[j].DataType;
jsonString.Append("\"" + strKey + "\":");
strValue = StringFormat(strValue, type);
if (j < dt.Columns.Count - 1)
{
jsonString.Append(strValue + ",");
}
else
{
jsonString.Append(strValue);
}
}
jsonString.Append("},");
}
jsonString.Remove(jsonString.Length - 1, 1);
jsonString.Append("]");
if (jsonString.Length == 1)
{
return "[]";
}
return jsonString.ToString();
}
public static string DataTableToJson(DataTable dt, string dtName)
{
StringBuilder sb = new StringBuilder();
sb.Append("{\"");
sb.Append(dtName);
sb.Append("\":[");
if (DataTableHelper.IsExistRows(dt))
{
foreach (DataRow dr in dt.Rows)
{
sb.Append("{");
foreach (DataColumn dc in dr.Table.Columns)
{
sb.Append("\"");
sb.Append(dc.ColumnName);
sb.Append("\":\"");
if (((dr[dc] != null) && (dr[dc] != DBNull.Value)) && (dr[dc].ToString() != ""))
{
sb.Append(dr[dc].ToString().Replace("\\", "\\\\").Replace("\'", "\\\'").Replace("\t", " ").Replace(
"\r", " ").Replace("\n", "
").Replace("\"", "'"));
//sb.Append(dr[dc].ToString().Replace("\"", "'").Replace("'","“")).Replace(@"\", "/");
}
else
{
sb.Append(" ");
}
sb.Append("\",");
}
sb = sb.Remove(sb.Length - 1, 1);
sb.Append("},");
}
sb = sb.Remove(sb.Length - 1, 1);
}
sb.Append("]}");
return JsonCharFilter(sb.ToString());
}
private static List GetObjectProperty(object o)
{
List propertyslist = new List();
PropertyInfo[] propertys = o.GetType().GetProperties();
foreach (PropertyInfo p in propertys)
{
propertyslist.Add(string.Concat(new object[] { "\"", p.Name.ToString(), "\":\"", p.GetValue(o, null), "\"" }));
}
return propertyslist;
}
public static string HashtableToJson(Hashtable data, string dtName)
{
StringBuilder sb = new StringBuilder();
sb.Append("{\"");
sb.Append(dtName);
sb.Append("\":[{");
foreach (object key in data.Keys)
{
object value = data[key];
sb.Append("\"");
sb.Append(key);
sb.Append("\":\"");
if (!(string.IsNullOrEmpty(value.ToString()) || (value == DBNull.Value)))
{
sb.Append(value).Replace(@"\", "/");
}
else
{
sb.Append(" ");
}
sb.Append("\",");
}
sb = sb.Remove(sb.Length - 1, 1);
sb.Append("}]}");
return JsonCharFilter(sb.ToString());
}
public static string IListToJson(IList list, bool FlagBool = false)
{
StringBuilder sb = new StringBuilder();
sb.Append("[");
foreach (T t in list)
{
sb.Append(ObjectToJson(t, FlagBool) + ",");
}
return (sb.ToString().TrimEnd(new char[] { ',' }) + "]");
}
public static string IListToJson(IList list, string ClassName)
{
StringBuilder sb = new StringBuilder();
sb.Append("{\"" + ClassName + "\":[");
foreach (T t in list)
{
sb.Append(ObjectToJson(t) + ",");
}
return (sb.ToString().TrimEnd(new char[] { ',' }) + "]}");
}
private static string JsonCharFilter(string sourceStr)
{
return sourceStr;
}
public static string ListToJson(List objlist, string jsonName, bool ObjectName = true)
{
string result = string.Empty;
if (ObjectName)
{
result += "{";
if (jsonName.Equals(string.Empty))
{
object o = objlist[0];
jsonName = o.GetType().ToString();
result = result + "\"" + jsonName + "\":[";
}
else
{
result = result + "\"" + jsonName + "\":[";
}
}
else
{
result = "[";
}
bool firstline = true;
foreach (object oo in objlist)
{
if (!firstline)
{
result = result + "," + ObjectToJson(oo);
}
else
{
result = result + ObjectToJson(oo);
firstline = false;
}
}
if (ObjectName)
{
return (result + "]}");
}
else
{
return (result + "]");
}
}
private static string ObjectToJson(object o)
{
string result = "{";
List ls_propertys = new List();
ls_propertys = GetObjectProperty(o);
foreach (string str_property in ls_propertys)
{
if (result.Equals("{"))
{
result = result + str_property;
}
else
{
result = result + "," + str_property;
}
}
return (result + "}");
}
public static string ObjectToJson(T t, bool FlagBool = false)
{
FlagBool = false;
StringBuilder sb = new StringBuilder();
string json = "";
if (t == null)
{
return json;
}
sb.Append("{");
PropertyInfo[] properties = t.GetType().GetProperties();
foreach (PropertyInfo pi in properties)
{
sb.Append("\"" + pi.Name.ToString() + "\"");
sb.Append(":");
if (FlagBool == true && pi.PropertyType.ToString() == "System.Boolean")
{
sb.Append(pi.GetValue(t, null));
}
else
{
sb.Append("\"" + pi.GetValue(t, null) + "\"");
}
sb.Append(",");
}
return (sb.ToString().TrimEnd(new char[] { ',' }) + "}");
}
public static string ObjectToJson(T t, string ClassName)
{
StringBuilder sb = new StringBuilder();
sb.Append("{\"" + ClassName + "\":[");
string json = "";
if (t == null)
{
return json;
}
sb.Append("{");
PropertyInfo[] properties = t.GetType().GetProperties();
foreach (PropertyInfo pi in properties)
{
sb.Append("\"" + pi.Name.ToString() + "\"");
sb.Append(":");
sb.Append("\"" + pi.GetValue(t, null) + "\"");
sb.Append(",");
}
return (sb.ToString().TrimEnd(new char[] { ',' }) + "}]}");
}
public static string ObjectToJson(IList IL, string jsonName)
{
StringBuilder Json = new StringBuilder();
Json.Append("{\"" + jsonName + "\":[");
if (IL.Count > 0)
{
for (int i = 0; i < IL.Count; i++)
{
PropertyInfo[] pis = Activator.CreateInstance().GetType().GetProperties();
Json.Append("{");
for (int j = 0; j < pis.Length; j++)
{
Json.Append(string.Concat(new object[] { "\"", pis[j].Name.ToString(), "\":\"", pis[j].GetValue(IL[i], null), "\"" }));
if (j < (pis.Length - 1))
{
Json.Append(",");
}
}
Json.Append("}");
if (i < (IL.Count - 1))
{
Json.Append(",");
}
}
}
Json.Append("]}");
return Json.ToString();
}
///
/// JSON格式数组转化为对应的List
///
///
/// JSON格式数组
///
public static List JSONStringToList(string JsonStr)
{
JavaScriptSerializer Serializer = new JavaScriptSerializer();
//设置转化JSON格式时字段长度
List objs = Serializer.Deserialize>(JsonStr);
return objs;
}
public static Object Json2Obj(String json, Type t)
{
try
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(t);
using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json)))
{
return serializer.ReadObject(ms);
}
}
catch
{
return null;
}
}
///
/// Json 字符串 转换为 DataTable数据集合
///
///
///
public static DataTable ToDataTable(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)
{
dataTable.Columns.Add(current, dictionary[current].GetType());
}
}
//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;
}
///
/// 将JSON解析成DataSet只限标准的JSON数据
/// 例如:Json={t1:[{name:'数据name',type:'数据type'}]}
/// 或 Json={t1:[{name:'数据name',type:'数据type'}],t2:[{id:'数据id',gx:'数据gx',val:'数据val'}]}
///
/// Json字符串
/// DataSet
public static DataSet JsonToDataSet(string Json)
{
try
{
DataSet ds = new DataSet();
JavaScriptSerializer JSS = new JavaScriptSerializer();
object obj = JSS.DeserializeObject(Json);
Dictionary datajson = (Dictionary)obj;
foreach (var item in datajson)
{
DataTable dt = new DataTable(item.Key);
object[] rows = (object[])item.Value;
foreach (var row in rows)
{
Dictionary val = (Dictionary)row;
DataRow dr = dt.NewRow();
foreach (KeyValuePair sss in val)
{
if (!dt.Columns.Contains(sss.Key))
{
dt.Columns.Add(sss.Key.ToString());
dr[sss.Key] = sss.Value;
}
else
dr[sss.Key] = sss.Value;
}
dt.Rows.Add(dr);
}
ds.Tables.Add(dt);
}
return ds;
}
catch
{
return null;
}
}
///
/// 过滤特殊字符
///
///
///
public static string String2Json(String s)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.Length; i++)
{
char c = s.ToCharArray()[i];
switch (c)
{
case '\"':
sb.Append("\\\""); break;
case '\\':
sb.Append("\\\\"); break;
case '/':
sb.Append("-"); break;
case '\b':
sb.Append("\\b"); break;
case '\f':
sb.Append("\\f"); break;
case '\n':
sb.Append("\\n"); break;
case '\r':
sb.Append("\\r"); break;
case '\t':
sb.Append("\\t"); break;
case '\v':
sb.Append("\\v"); break;
case '\0':
sb.Append("\\0"); break;
default:
sb.Append(c); break;
}
}
return sb.ToString();
}
///
/// 格式化字符型、日期型、布尔型
///
///
///
///
private static string StringFormat(string str, Type type)
{
if (type != typeof(string) && string.IsNullOrEmpty(str))
{
str = "\"" + str + "\"";
}
else if (type == typeof(string))
{
str = String2Json(str);
str = "\"" + str + "\"";
}
else if (type == typeof(DateTime))
{
str = "\"" + str + "\"";
}
else if (type == typeof(bool))
{
str = str.ToLower();
}
else if (type == typeof(byte[]))
{
str = "\"" + str + "\"";
}
else if (type == typeof(Guid))
{
str = "\"" + str + "\"";
}
return str;
}
}
}