Skip to content

C# 对 JSON 的支持


🏷 杂项   🕒 4/11/2013

.net 本身对 JSON 的对象映射做的很好,如果 JSON 数据的格式确定,并不太需要第三方库。 下面通过一个例子来简单介绍下.net 中 JSON 的使用。

需要引用的 namespace:
using System.Runtime.Serialization.Json;

然后下面是利用泛型 实现的一个通用的解析/转储 JSON 类:

csharp
public static class JSON
{

    public static T parse<T>(string jsonString)
    {
        using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)))
        {
            return (T)new DataContractJsonSerializer(typeof(T)).ReadObject(ms);
        }
    }

    public static string stringify(object jsonObject)
    {
        using (var ms = new MemoryStream())
        {
            new DataContractJsonSerializer(jsonObject.GetType()).WriteObject(ms, jsonObject);
            return Encoding.UTF8.GetString(ms.ToArray());
        }
    }
}

只需要定义好数据对象,就可以进行 Object 自动映射解析了,假如需要解析的 json 格式为:

json
{
  "name": "ding",
  "age": 23
}

那么我们应该如下定义数据对象(注意需要引用命名空间 using System.Runtime.Serialization;):

csharp
[DataContract]
class User
{
    [DataMember]
    public String name{ set; get; }

    [DataMember(Name = "age")] //如果需要改变解析/转储时候的json key的名字的映射关系,这里的可以设置Name参数
    public int _age { set; get; }
}

转换过程如下:

csharp
//解析:
User user = JSON.parse<User>(strData);
//转储:
String strData = JSON.stringify(user)

内嵌类型

如果有嵌套,如何定义模型呢? 比如:

json
{
   "name":"ding",
   "age":23,
   "girlfriends":
   [
     {
       "name":"",
       "nickName":""
     },
     ...
   ]
}

只需定义 List 类型就可以了

csharp
[DataContract]
class User
{
    [DataMember]
    public String name{ set; get; }

    [DataMember(Name = "age")]
    public int _age { set; get; }

    [DataMember]
    public List<GirlFriend> girlFriends {set; get;}
}

[DataContract]
class GirlFriend
{
    [DataMember]
    public String name{ set; get; }

    [DataMember]
    public String nickName { set; get; }
}