一、介紹
JSON(JavaScript Object Notation) 是一種輕量級的資料交換格式,基於JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一個子集
方法有多種,我這邊用到是DataContractJsonSerializer類,官方解釋:“NET Framework 4 .NET Framework 3.5 Silverlight 將對象序列化為 JavaScript 物件標記法 (JSON),並將 JSON 資料還原序列化為對象”。還增加了DataTable轉換成Json對象的方法。
其命名空間如下:
注意:如果是.NET Framework 3.5 光引用了“System.Runtime.Serialization”了這個還不行。運行時會發現:
所以還要引用下“System.ServiceModel.Web”即可。 .NET Framework 4則在System.Runtime.Serialization下。
二、對JSON資料操作
源碼:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Collections.Generic;
using System.Runtime.Serialization.Json;
using System.Reflection;
namespace Test.Utils
{
public class JsonHelper
{
/// <summary>
/// JSON序列化
/// 將泛型list對象轉換成JSON類型串
/// <param name="t">對象(實體物件或其他對象)</param>
/// </summary>
public static string JsonSerializer_to_Json<T>(T t)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
MemoryStream ms = new MemoryStream();
ser.WriteObject(ms, t);
string jsonString = Encoding.UTF8.GetString(ms.ToArray());
ms.Close();
//替換Json的Date字串
string p = @"\\/Date\((\d+)\+\d+\)\\/";
MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString);
Regex reg = new Regex(p);
jsonString = reg.Replace(jsonString, matchEvaluator);
return jsonString;
}
/// <summary>
/// JSON還原序列化
/// 將JSON類型串轉換成泛型list對象
/// <param name="jsonString">json格式的字串</param>
/// </summary>
public static T JsonDeserialize_JsonTo<T>(string jsonString)
{
//將"yyyy-MM-dd HH:mm:ss"格式的字串轉為"\/Date(1294499956278+0800)\/"格式
string p = @"\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}";
MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertDateStringToJsonDate);
Regex reg = new Regex(p);
jsonString = reg.Replace(jsonString, matchEvaluator);
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
T obj = (T)ser.ReadObject(ms);
return obj;
}
/// <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>
/// 將泛型list對象轉換成JSON類型串(二)
/// </summary>
/// <typeparam name="T">物件類型或實體類型</typeparam>
/// <param name="jsonName">對該對象起名字</param>
/// <param name="IL">Ilist對象</param>
/// <returns></returns>
public static string ObjectToJson<T>(string jsonName, IList<T> IL)
{
StringBuilder Json = new StringBuilder();
Json.Append("{\"" + jsonName + "\":[");
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++)
{
Json.Append("\"" + 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();
}
/// <summary>
/// 將資料錶轉換成JSON類型串
/// </summary>
/// <param name="dt">要轉換的資料表</param>
/// <returns></returns>
public static StringBuilder DataTableToJSON(System.Data.DataTable dt)
{
return DataTableToJSON(dt, true);
}
/// <summary>
/// 將資料錶轉換成JSON類型串
/// </summary>
/// <param name="dt">要轉換的資料表</param>
/// <param name="dispose">資料錶轉換結束後是否dispose掉</param>
/// <returns></returns>
public static StringBuilder DataTableToJSON(System.Data.DataTable dt, bool dt_dispose)
{
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append("[");
//資料表欄位名和類型數組
string[] dt_field = new string[dt.Columns.Count];
int i = 0;
string formatStr = "{{";
string fieldtype = "";
foreach (System.Data.DataColumn dc in dt.Columns)
{
dt_field[i] = dc.Caption.ToLower().Trim();
formatStr += '"' + dc.Caption.ToLower().Trim() + '"' + ":";
fieldtype = dc.DataType.ToString().Trim().ToLower();
if (fieldtype.IndexOf("int") > 0 || fieldtype.IndexOf("deci") > 0 ||
fieldtype.IndexOf("floa") > 0 || fieldtype.IndexOf("doub") > 0 ||
fieldtype.IndexOf("bool") > 0)
{
formatStr += "{" + i + "}";
}
else
{
formatStr += '"' + "{" + i + "}" + '"';
}
formatStr += ",";
i++;
}
if (formatStr.EndsWith(","))
{
formatStr = formatStr.Substring(0, formatStr.Length - 1);//去掉尾部","號
}
formatStr += "}},";
i = 0;
object[] objectArray = new object[dt_field.Length];
foreach (System.Data.DataRow dr in dt.Rows)
{
foreach (string fieldname in dt_field)
{ //對 \ , ' 符號進行轉換
objectArray[i] = dr[dt_field[i]].ToString().Trim().Replace("\\", "\\\\").Replace("'", "\\'").Replace("\n", "");
switch (objectArray[i].ToString())
{
case "True":
{
objectArray[i] = "true"; break;
}
case "False":
{
objectArray[i] = "false"; break;
}
default: break;
}
i++;
}
i = 0;
stringBuilder.Append(string.Format(formatStr, objectArray));
}
if (stringBuilder.ToString().EndsWith(","))
{
stringBuilder.Remove(stringBuilder.Length - 1, 1);//去掉尾部","號
}
if (dt_dispose)
{
dt.Dispose();
}
return stringBuilder.Append("]");
}
/// <summary>
/// datatable分頁
/// </summary>
/// <param name="dt"></param>
/// <param name="PageIndex"></param>
/// <param name="PageSize"></param>
/// <returns></returns>
public static DataTable GetPagedTable(DataTable dt, int PageIndex, int PageSize)
{
if (PageIndex == 0)
return dt;
DataTable newdt = dt.Clone();
int rowbegin = (PageIndex - 1) * PageSize;
int rowend = PageIndex * PageSize;
if (rowbegin >= dt.Rows.Count)
return newdt;
if (rowend > dt.Rows.Count)
rowend = dt.Rows.Count;
for (int i = rowbegin; i <= rowend - 1; i++)
{
DataRow newdr = newdt.NewRow();
DataRow dr = dt.Rows[i];
foreach (DataColumn column in dt.Columns)
{
newdr[column.ColumnName] = dr[column.ColumnName];
}
newdt.Rows.Add(newdr);
}
return newdt;
}
/// <summary>
/// 返回有效名稱
/// </summary>
/// <param name="unName"></param>
/// <param name="unEnName"></param>
/// <returns></returns>
public static string GetValidateName(string firName, string secEnName)
{
string strName = "";
if (!String.IsNullOrEmpty(firName))
{
strName = firName;
}
else
{
if (!String.IsNullOrEmpty(secEnName))
{
strName = secEnName;
}
}
return strName;
}
}
}
實驗下:
Product
3 |
publicstringproName {get;set; } |
4 |
publicdecimal proPrice {get;set; } |
5 |
publicstringproAttr {get;set; } |
6 |
publicstringproAddres {get;set; } |
操作
1:序列化
1 |
Product pro = newProduct(); |
6 |
string josn = JSONHelper.JsonSerializer<Product>(pro); |
7 |
//序列化Message.ShowAlert("提示", josn); |
2,還原序列化
1 |
string json = "{\"proAddres\":\"上海\",\"proAttr\":\"cpu\",\"proName\":\"電腦\",\"proPrice\":3680}"; |
2 |
Product pro = JSONHelper.JsonDeserialize<Product>(json); |