ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Net 解析 json 数据

Net 解析 json 数据

Linux操作系统 作者:王雅曦 时间:2015-08-10 19:20:56 0 删除 编辑
在.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人收藏

支持

1

反对

0

发表评论

复制代码
保存代码

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30403026/viewspace-1767475/,如需转载,请注明出处,否则将追究法律责任。

上一篇: C# 读取 json 数据
下一篇: .NET MVC3 JSONP 跨域
请登录后发表评论 登录
全部评论

注册时间:2015-08-10

  • 博文量
    8
  • 访问量
    3221