对C#和.net使用List<自定义>和Json格式相互转化的方法进行总结
关于JSON的入门介绍见http://www.json.org/ ,或者百度,这里不赘述,不过通过下面的例子会有个更快捷和更直观的认识。
如Json格式[{"id":"1","name":"sara"},{"id":"2","name":"sara2"}]
自定义数据类型,用于List<>:
[DataContract] class Person { [DataMember] public int id; [DataMember] public string name; }
程序中使用:
首先加入引用:
using System.Runtime.Serialization.Json;
using System.Runtime.Serialization;
using System.Text;
代码内容:
class Program { static void Main(string[] args) { //Product.GetAllSmartPhones(); List工程化时,可以对自定义数据结构重新定义一个类:nums = new List nums.Add(new Person() { id=1, name="sara" }); nums.Add(new Person() { id=1, name="sylar" }); DataContractJsonSerializer json = new DataContractJsonSerializer(nums.GetType()); string szJson = ""; //序列化 using (MemoryStream stream = new MemoryStream()) { json.WriteObject(stream, nums); szJson = Encoding.UTF8.GetString(stream.ToArray()); } Console.WriteLine(szJson); Console.ReadLine(); } }();
如:
public class TestListResult
{
public TestListResult()
{
this.Successed = false;
this.Message = "";
}
public bool Successed { get; set; }
public string Message { get; set; }
}
使用时同上在一个文件里一样
理解了以上原理,可以使用以下函数在项目中使用:
List
public static string Obj2Json(T data)
{
try
{
System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(data.GetType());
using (MemoryStream ms = new MemoryStream())
{
serializer.WriteObject(ms, data);
return Encoding.UTF8.GetString(ms.ToArray());
}
}
catch
{
return null;
}
}
public static Object Json2Obj(String json,Type t)
{
try
{
System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(t);
using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json)))
{
return serializer.ReadObject(ms);
}
}
catch
{
return null;
}
}
public static string DataTable2Json(DataTable dt)
{
if (dt.Rows.Count == 0)
{
return "";
}
StringBuilder jsonBuilder = new StringBuilder();
// jsonBuilder.Append("{");
//jsonBuilder.Append(dt.TableName.ToString());
jsonBuilder.Append("[");//转换成多个model的形式
for (int i = 0; i < dt.Rows.Count; i++)
{
jsonBuilder.Append("{");
for (int j = 0; j < dt.Columns.Count; j++)
{
jsonBuilder.Append("\"");
jsonBuilder.Append(dt.Columns[j].ColumnName);
jsonBuilder.Append("\":\"");
jsonBuilder.Append(dt.Rows[i][j].ToString());
jsonBuilder.Append("\",");
}
jsonBuilder.Remove(jsonBuilder.Length - 1, 1);
jsonBuilder.Append("},");
}
jsonBuilder.Remove(jsonBuilder.Length - 1, 1);
jsonBuilder.Append("]");
// jsonBuilder.Append("}");
return jsonBuilder.ToString();
}
public static T Json2Obj(string json)
{
T obj = Activator.CreateInstance();
using (System.IO.MemoryStream ms = new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(json)))
{
System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(obj.GetType());
return (T)serializer.ReadObject(ms);
}
}
public class JsonHelper
{
///
/// 生成Json格式
///
///
///
///
public static string GetJson(T obj)
{
DataContractJsonSerializer json = new DataContractJsonSerializer(obj.GetType());
using (MemoryStream stream = new MemoryStream())
{
json.WriteObject(stream, obj);
string szJson = Encoding.UTF8.GetString(stream.ToArray());
return szJson;
}
}
///
/// 获取Json的Model
///
///
///
///
public static T ParseFromJson(string szJson)
{
T obj = Activator.CreateInstance();
using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(szJson)))
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
return (T)serializer.ReadObject(ms);
}
}
}
///
/// 反回JSON数据到前台
///
/// 数据表
/// JSON字符串
public string DataTableToJson(DataTable dt)
{
StringBuilder JsonString = new StringBuilder();
if (dt != null && dt.Rows.Count > 0)
{
JsonString.Append("{ ");
JsonString.Append("\"TableInfo\":[ ");
for (int i = 0; i < dt.Rows.Count; i++)
{
JsonString.Append("{ ");
for (int j = 0; j < dt.Columns.Count; j++)
{
if (j < dt.Columns.Count - 1)
{
JsonString.Append("\"" + dt.Columns[j].ColumnName.ToString() + "\":" + "\"" + dt.Rows[i][j].ToString() + "\",");
}
else if (j == dt.Columns.Count - 1)
{
JsonString.Append("\"" + dt.Columns[j].ColumnName.ToString() + "\":" + "\"" + dt.Rows[i][j].ToString() + "\"");
}
}
if (i == dt.Rows.Count - 1)
{
JsonString.Append("} ");
}
else
{
JsonString.Append("}, ");
}
}
JsonString.Append("]}");
return JsonString.ToString();
}
else
{
return null;
}
}
public static class JsonTableHelper
{
///
/// 返回对象序列化
///
/// 源对象
/// json数据
public static string ToJson(this object obj)
{
JavaScriptSerializer serialize = new JavaScriptSerializer();
return serialize.Serialize(obj);
}
///
/// 控制深度
///
/// 源对象
/// 深度
/// json数据
public static string ToJson(this object obj, int recursionDepth)
{
JavaScriptSerializer serialize = new JavaScriptSerializer();
serialize.RecursionLimit = recursionDepth;
return serialize.Serialize(obj);
}
///
/// DataTable转为json
///
/// DataTable
/// json数据
public static string ToJson(DataTable dt)
{
Dictionary dic = new Dictionary();
int index = 0;
foreach (DataRow dr in dt.Rows)
{
Dictionary result = new Dictionary();
foreach (DataColumn dc in dt.Columns)
{
result.Add(dc.ColumnName, dr[dc].ToString());
}
dic.Add(index.ToString(), result);
index++;
}
return ToJson(dic);
}
}
一、前台产生Json数据传递给后台处理
前台生成Json数据要使用javascript和json.js。
json.js 下载地址:http://www.json.org/json.js
前台代码:
var people = [{ "UserName": "t1", "PassWord": "111111", "Sex": "男" },{ "UserName": "t2", "PassWord": "222222", "Sex": "女" }];
var url = "Default.aspx?people=" + escape(people.toJSONString());
request.open("POST", url, true);
request.onreadystatechange = updatePage;
request.send(null);
同上面的转化原理一样,我们先建立一个json数据类,便于List<>中使用。
[DataContract]//序列化
public class TestObj
{
[DataMember]
public string UserName { get; set; }
[DataMember]
public string PassWord { get; set; }
[DataMember]
public string Sex { get; set; }
public TestObj(string u,string p,string s)
{
UserName = u;
PassWord = p;
Sex = s;
}
}
//json 序列化
public static string ToJsJson(object item)
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(item.GetType());
using(MemoryStream ms=new MemoryStream())
{
serializer.WriteObject(ms, item);
StringBuilder sb = new StringBuilder();
sb.Append(Encoding.UTF8.GetString(ms.ToArray()));
return sb.ToString();
}
}
//反序列化
public static T FromJsonTo(string jsonString)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)))
{
T jsonObject = (T)ser.ReadObject(ms);
return jsonObject;
}
}
//获取json字符串
string jsonStr = Request["people"];
List obj = Json.FromJsonTo>(jsonStr);
foreach (TestObj item in obj)
{
Response.Write(string.Format("UserName:{0},Password:{1},Sex:{2}/r/n", item.UserName, item.PassWord, item.Sex));
}
Response.End();
List Users = new List();
Users.Add(new TestObj("t1", "1", "男"));
Users.Add(new TestObj("t2", "2", "女"));
string json = Json.ToJsJson(Users);
Response.Write(json);
Response.End();
后台产生Json数据的方法如上原理中提到的:
string Json;
DataContractJsonSerializer json = new DataContractJsonSerializer(list.GetType());
using (MemoryStream stream = new MemoryStream())
{
json.WriteObject(stream, list);
Json = Encoding.UTF8.GetString(stream.ToArray());
}
return Json;
///
/// Json的数据结构
///
[DataContract]
class ResultJson
{
[DataMember]
public bool Result;
[DataMember]
public int Count;
[DataMember]
public string Message;
}
function updatePage() {
if (request.readyState == 4) {
if (request.status == 200) {
var response = request.responseText;
//转化成对象
//方法1
response = response.parseJSON();
//方法2
// response = eval("(" + response + ")");
//对象访问方式
document.getElementById("d1").innerHTML = response[1].Sex;
//直接输出
// document.getElementById("d1").innerHTML = response;
}
}
}
假如我们要转化的JSON字符串格式为:
{
"encoding":"UTF-8",
"plug-ins":["python","c++","ruby"],
"indent":{
"length":3,
"use_space":true
}
}
然后编写相应的序列化的类,注意下面Indent类加的属性:
[DataContract]
class Config
{
[DataMember(Order = 0)]
public string encoding { get; set; }
[DataMember(Order = 1)]
public string[] plugins { get; set; }
[DataMember(Order = 2)]
public Indent indent { get; set; }
}
[DataContract]
class Indent
{
[DataMember(Order = 0)]
public int length { get; set; }
[DataMember(Order = 1)]
public bool use_space { get; set; }
}
var config = new Config(){
encoding = "UTF-8",
plugins = new string[]{"python", "C++", "C#"},
indent = new Indent(){ length = 4, use_space = false}
};
var serializer = new DataContractJsonSerializer(typeof(Config));
var stream = new MemoryStream();
serializer.WriteObject(stream, config);
byte[] dataBytes = new byte[stream.Length];
stream.Position = 0;
stream.Read(dataBytes, 0, (int)stream.Length);
string dataString = Encoding.UTF8.GetString(dataBytes);
Console.WriteLine("JSON string is:");
Console.WriteLine(dataString);
结果:
JSON string is:
{"encoding":"UTF-8","plugins":["python","C++","C#"],"indent":{"length":4,"use_space":false}}
var mStream = new MemoryStream(Encoding.Default.GetBytes(dataString));
Config readConfig = (Config)serializer.ReadObject(mStream);
Console.WriteLine("Encoding is: {0}", readConfig.encoding);
foreach (string plugin in readConfig.plugins)
{
Console.WriteLine("plugins is: {0}", plugin);
}
Console.WriteLine("indent.length is: {0}", readConfig.indent.length);
Console.WriteLine("indent.use_space is: {0}", readConfig.indent.use_space);
结果:
Encoding is: UTF-8
plugins is: python
plugins is: C++
plugins is: C#
indent.length is: 4
indent.use_space is: False