.net中解析json 之 DataContractJsonSerializer类
时间:2010-10-19 来源:远-方
DataContractJsonSerializer是fm3.5中专门对json序列化和反序列化的类,以下是DataContractJsonSerializer的简单应用
假设客户端有个json对象,通过ajax传到后台,后台解析
代码如下:
view plaincopy to clipboardprint?
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);
toJSONString函数正常运行得引用json.js
<script src="json.js" type="text/javascript"></script>
后台代码:
新建测试类 testobj (testobj中的属性和客户端传递过来的一致)
view plaincopy to clipboardprint?
[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;
}
}
新建序列化和反序列化方法
view plaincopy to clipboardprint?
//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<T>(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<T>(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(解析)注:people即客户端传递过来
view plaincopy to clipboardprint?
//获取json字符串
string jsonStr = Request["people"];
List<TestObj> obj = Json.FromJsonTo<List<TestObj>>(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<TestObj> obj = Json.FromJsonTo<List<TestObj>>(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字符串
view plaincopy to clipboardprint?
List<TestObj> Users = new List<TestObj>();
Users.Add(new TestObj("t1", "1", "男"));
Users.Add(new TestObj("t2", "2", "女"));
string json = Json.ToJsJson(Users);
Response.Write(json);
Response.End();
List<TestObj> Users = new List<TestObj>();
Users.Add(new TestObj("t1", "1", "男"));
Users.Add(new TestObj("t2", "2", "女"));
string json = Json.ToJsJson(Users);
Response.Write(json);
Response.End();
前台获取后台返回的json字符串:
view plaincopy to clipboardprint?
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;
}
}
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xylinzai_xy/archive/2010/09/26/5907610.aspx