c#在Asp.Net中解析json数据

来自: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;
      } 
  }
}

介绍完毕。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值