c# list转为json_C#中如何将List<自定义>转为Json格式 及相关函数-DataContractJsonSerializer...

本文详细介绍了C#中如何将List转换为Json格式,包括使用DataContractJsonSerializer进行序列化和反序列化的方法。还提供了一些实用的辅助函数,如Json2Obj和Obj2Json,用于在Json和自定义对象之间转换,并演示了DataTable到Json的转换。这些方法在实际项目中方便地处理Json数据。
摘要由CSDN通过智能技术生成

对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();

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 : List{public TestListResult(){this.Successed = false;this.Message = "";}public bool Successed { get; set; }public string Message { get; set; }}

使用时同上在一个文件里一样

理解了以上原理,可以使用以下函数在项目中使用:

List转Json

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 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;

}

}

Json转List

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 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;

}

}

DataTable 转Json

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 

{

jsonBuilder.Append("{");

for (int j = 0; 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 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();

}

单个对象转JSON

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 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);

}

}

}

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 

{

JsonString.Append("{ ");

for (int j = 0; j 

{

if (j 

{

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;

}

}

///

/// 反回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);

}

}

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。

前台代码:

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);

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;

}

}

[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数据相互转化函数

//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 序列化

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;

}

}

在后台代码中调用以上函数进行对数据people的处理:

//获取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();

//获取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();

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数据

后台产生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;

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;

}

///

/// Json的数据结构

///

[DataContract]

class ResultJson

{

[DataMember]

public bool Result;

[DataMember]

public int Count;

[DataMember]

public string Message;

}

前台获取后台返回的Json字符串:

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;

}

}

}

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字符串操作方法:

假如我们要转化的JSON字符串格式为:

{

"encoding":"UTF-8",

"plug-ins":["python","c++","ruby"],

"indent":{

"length":3,

"use_space":true

}

}

{

"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; }

}

[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; }

}

输出JSON字符串

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);

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}}

JSON string is:

{"encoding":"UTF-8","plugins":["python","C++","C#"],"indent":{"length":4,"use_space":false}}

读取Json字符串内容:

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);

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

二。

///

2         /// 将datatable转换为json

3         ///

4         /// Dt

5         /// JSON字符串

6         public static string Dtb2Json(DataTable dtb)

7         {

8             JavaScriptSerializer jss = new JavaScriptSerializer();

9             System.Collections.ArrayList dic = new System.Collections.ArrayList();

10             foreach (DataRow dr in dtb.Rows)

11             {

12                 System.Collections.Generic.Dictionary drow = new System.Collections.Generic.Dictionary();

13                 foreach (DataColumn dc in dtb.Columns)

14                 {

15                     drow.Add(dc.ColumnName, dr[dc.ColumnName]);

16                 }

17                 dic.Add(drow);

18

19             }

20             //序列化

21             return jss.Serialize(dic);

22         }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值