远-方的博客

在.Net C#中如何解析json数据(DataContractJsonSerializer类)

json 是一种轻量级的文本传输格式,在AJAX架构的WEB应用中,用于前台和后台的数据交换格式非常简洁方便,下面就如何使用结合一个实例加以说明:

 

DataContractJsonSerializer是.Net框架3.5版中用于实现对json序列化(即json对象->json文本)和反序列化(json文本->json对象)的类,以下是DataContractJsonSerializer的简单应用方法:

假设客户端有个json对象,该json对象格式为:

 [{ID:111,Lat:37.9,Long:116.8},{ID:112,Lat:38.9,Long:16.8},{ID:113,Lat:33.9,Long:119.8}]

 

通过ajax传到后台服务程序,后台解析代码如下:

引用部分:

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;//!!!
using System.Runtime.Serialization.Json;//!!!
using System.IO;
using System.Text;

新建一个与前台传过来的json格式一样的类(注意:类中的属性和客户端传递过来的要一致)

 

[DataContract]  //非常重要,没有这语句,则无法进行反序列化Json对象
    public class pmGPS
    {
        [DataMember]//非常重要
        public int ID { get; set; }
        [DataMember]//非常重要
        public decimal Lat { get; set; }
        [DataMember]//非常重要
        public decimal Long { get; set; }  

        //构造函数
        public pmGPS(int pmId, decimal pmLat, decimal pmLong)
        {
            ID = pmId;
            Lat = pmLat;
            Long = pmLong;
        }     

    }

 

自定义的类建完后,还要再写一个函数,这个函数演示了DataContractJsonSerializer类的使用方法:

 

 public static T FromJsonTo<T>(string jsonString)
    {
        DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
        MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));

            T jsonObject = (T)ser.ReadObject(ms);
            return jsonObject;

    } 

好了,现在我们可以处理客户端提交过来的json格式的数据了:

 

//反序列化json 

System.IO.Stream stream = Request.InputStream;
System.IO.StreamReader sr = new System.IO.StreamReader(stream, System.Text.Encoding.GetEncoding("UTF-8"));
string sJson = sr.ReadToEnd();

List<pmGPS> pmObj = FromJsonTo<List<pmGPS>>(sJson);
sJson = "";
foreach (pmGPS item in pmObj)
{
      sJson += string.Format(" ID:{0},Lat:{1},Long:{2}\r\n", item.ID, item.Lat, item.Long);

}

看到了吧,这时就可以使用item.ID的方法来引用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();  
        }  
    }   
  
序列化成json字符串

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

 

OK,就到这里!

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xylinzai_xy/archive/2010/09/26/5907610.aspx

posted on 2010-10-19 22:01  远-方  阅读(14693)  评论(0编辑  收藏  举报

导航