来自:http://outofmemory.cn/code-snippet/1466/c-Asp-Net-jiexi-json-data
在.Net framework 3.5之后有了System.Runtime.Serialization.Json命名空间,利用这个命名空间我们可以方便的序列化反序列化json数据。
要做json的序列化和反序列化,首先需要我们定义json对应的csharp类:
假定我们要序列化Person类,如下代码定义:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Runtime.Serialization;
namespace WebApplication1
{
[Serializable]
[DataContract]
public class Person
{
[DataMember(Order=1,Name="id")]
public int ID { get; set; }
[DataMember(Order=2,Name="name")]
public String Name { get; set; }
}
}
需要注意Person类必须指定DataContract attribute,否则会出现属性名称都是k__BackingField的问题。另外需要做json序列化的属性必须设置DataMember的属性,可以指定Order和Name,分别表示顺序号和属性序列化时的名称。
定义好了Person类,我们就可以使用DataContractJsonSerializer类来做json的序列化和反序列化了。
注意要使用DataContractJsonSerializer做json的序列化和反序列化,必须在web项目中引用:
System.Runtime.Serialization
System.ServiceModel
System.ServiceModel.Web
三个程序集。
DataContractJsonSerializer类提供了WriteObject(Stream,Object)和ReadObject(Object)两个方法来做json的序列化和反序列化。
如下是样例代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Runtime.Serialization.Json;
using System.IO;
using System.Text;
namespace WebApplication1
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Person person = new Person { ID = 1,Name="OutOfMemory.CN" };
DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(Person));
//序列化json对象
using (var ms = new MemoryStream())
{
jsonSerializer.WriteObject(ms, person);
String json = Encoding.UTF8.GetString(ms.ToArray());
literalJson.Text = json;
}
//反序列化json对象
var jsonText = @"{""id"":2,""name"":""OutOfMemory.CN""}";
using (var ms = new MemoryStream())
{
var buffer = Encoding.UTF8.GetBytes(jsonText);
ms.Write(buffer, 0, buffer.Length);
ms.Seek(0, SeekOrigin.Begin);
var objPerson = (Person)jsonSerializer.ReadObject(ms);
literalPersonInfo.Text = string.Format("person id == {0},person name = {1}", objPerson.ID, objPerson.Name);
}
}
}
}
上面的方法只能对Person类做序列化和反序列化,我们也可以写成一个泛型方法,来方便使用: 如下代码:
public static class JsonConvert{
public static string Serialize<T>(T obj)
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
using (MemoryStream ms = new MemoryStream())
{
serializer.WriteObject(ms, obj);
return Encoding.Default.GetString(ms.ToArray());
}
}
public static T Deserialise<T>(string json)
{
T obj = Activator.CreateInstance<T>();
using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
obj = (T)serializer.ReadObject(ms);
return obj;
}
}
}
介绍完毕。