您的位置:首页 > Web前端 > JavaScript

.NET进行Json的序列化和反序列化

2010-11-23 00:15 519 查看
最近发现在不同模块交换数据的时候,不仅可以用XML,也可以用Json,而且Jquery与Json格式的数据结合的非常好,方便前台代码操作数据,所以经常把数据转换为Json,输出到网页里,然后获得方把数据进行反序列化。个人觉得如果这个数据时后台操作,可以把数据转换为XML形式输出到网页里,参见我的上篇文章《把XML文件输出到一个网页里》,如果这个对象数据是让前台JavaScript来获得,则需要把数据转换为Json的形式来输出到网页里或一般处理程序(ashx)里比较合适。

1、添加引用System.Runtime.Serialization.Json,System.ServiceModel.Web,见下图



2、首先要导入命名空间

//导入相关命名空间
using System.Runtime.Serialization.Json;    //DataContractJsonSerializer的命名空间
using System.Text;                  //Encoding,StringBuilder的命名空间
using System.IO;                    //MemoryStream的命名空间
using System.Collections.Generic;   //List的命名空间


3、完整代码如下:

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
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.Xml.Linq;

//导入相关命名空间 using System.Runtime.Serialization.Json; //DataContractJsonSerializer的命名空间 using System.Text; //Encoding,StringBuilder的命名空间 using System.IO; //MemoryStream的命名空间 using System.Collections.Generic; //List的命名空间
namespace LxXML
{
public partial class ObjectAndJSon : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{

List<Student> list=new List<Student>();
DataTable dt = GetStudentDataSet().Tables[0];

//读取数据到集合里
foreach (DataRow dr in dt.Rows)
{
Student stu = new Student();
stu.StuId = dr["StuId"].ToString();
stu.StuName = dr["StuName"].ToString();
stu.StuSex = dr["StuSex"].ToString();
stu.StuAge =int.Parse( dr["StuAge"].ToString());
stu.StuAddress = dr["StuAddress"].ToString();
list.Add(stu);
}

//将对象序列化为Json数据
string output = ObjectToJsonTwo(list);
Response.Write(output + "<br/><br/>");

//将JSON字符串反序列化为对象
JsonToObject(output);
}

/// <summary>
/// 将JSON字符串反序列化为对象
/// </summary>
/// <param name="strJson">Json字符串</param>
public void JsonToObject(string strJson)
{
DataContractJsonSerializer deSerializer = new DataContractJsonSerializer(typeof(List<Student>));
using(MemoryStream memoryStre=new MemoryStream(Encoding.UTF8.GetBytes(strJson))){
List<Student> list = deSerializer.ReadObject(memoryStre) as List<Student>;
foreach (Student stu in list)
{
Response.Write("ID=" + stu.StuId.ToString()+"<br/>");
Response.Write("StuName=" + stu.StuName.ToString() + "<br/>");
Response.Write("StuSex=" + stu.StuSex.ToString() + "<br/>");
Response.Write("StuAge=" + stu.StuAge.ToString() + "<br/>");
Response.Write("StuAddress=" + stu.StuAddress.ToString() + "<br/><br/>");
}
}
}
/// <summary>
/// 将对象转化成Json字符串,方法一
/// </summary>
/// <param name="obj">需要格式化的对象</param>
/// <returns>Json字符串</returns>
public string ObjectToJsonOne(object obj)
{
string output = string.Empty;
DataContractJsonSerializer dataSerializer = new DataContractJsonSerializer(obj.GetType());

using (MemoryStream ms = new MemoryStream())
{
dataSerializer.WriteObject(ms, obj);
output = Encoding.UTF8.GetString(ms.ToArray());
}
return output;
}

/// <summary>
/// 将对象转化成Json字符串,方法二
/// </summary>
/// <param name="obj">需要格式化的对象</param>
/// <returns>Json字符串</returns>
public string ObjectToJsonTwo(object obj)
{
// 首先,当然是JSON序列化
DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());

// 定义一个stream用来存发序列化之后的内容
Stream stream = new MemoryStream();
serializer.WriteObject(stream, obj);

// 从头到尾将stream读取成一个字符串形式的数据,并且返回
stream.Position = 0;
StreamReader streamReader = new StreamReader(stream);
return streamReader.ReadToEnd();
}

//测试数据,当然正式开发DataSet里的数据应该来自数据库
public DataSet GetStudentDataSet()
{
DataSet ds = new DataSet("School"); //给DataSet起名,作为跟节点
DataTable dt = ds.Tables.Add("Student");//给DataTable起名,作为下一个节点

//DataTable dt = new DataTable("Student");

dt.Columns.Add("StuId", typeof(string));
dt.Columns.Add("StuName", typeof(string));
dt.Columns.Add("StuSex", typeof(string));
dt.Columns.Add("StuAge", typeof(int));
dt.Columns.Add("StuAddress", typeof(string));

DataRow row = dt.NewRow();
row["StuId"] = "001";
row["StuName"] = "李大力";
row["StuSex"] = "男";
row["StuAge"] = 20;
row["StuAddress"] = "辽宁省大连市";
dt.Rows.Add(row);

row = dt.NewRow();
row["StuId"] = "002";
row["StuName"] = "崔锡华";
row["StuSex"] = "女";
row["StuAge"] = 24;
row["StuAddress"] = "吉林省延吉市";
dt.Rows.Add(row);

row = dt.NewRow();
row["StuId"] = "004";
row["StuName"] = "张叶挺";
row["StuSex"] = "男";
row["StuAge"] = 33;
row["StuAddress"] = "广东省深圳市";
dt.Rows.Add(row);

//ds.Tables.Add(dt);
return ds;
}

}
//建立一个学生的Model
public class Student
{
public string StuId
{
get;
set;
}
public string StuName
{
get;
set;
}
public string StuSex
{
get;
set;
}
public int StuAge
{
get;
set;
}
public string StuAddress
{
get;
set;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: