在C#中,Json的序列化和反序列化帮助类

Table of Contents

1 Json基本介绍

Json【javascript对象表示方法】,它是一个轻量级的数据交换格式,我们可以很简单的来读取和写它, 并且它很容易被计算机转化和生成,它是完全独立于语言的。

1.1 Json支持的数据结构

1.1.1 键值对的集合

各种不同的编程语言,都支持这种数据结构;

1.1.2 有序的列表类型值的集合

这其中包含数组,集合,矢量,或者序列,等等。

1.2 Json的表现形式

1.2.1 对象

一个没有顺序的“键/值”,一个对象以花括号“{”开始,并以花括号"}"结束,在每一个“键”的后面,有一个冒号,并且使用逗号来分隔多个键值对。例如:

var user = {"name":"anbgsl1110","gender":"Male","birthday":"1993-06-13"}

1.2.2 数组

设置值的顺序,一个数组以中括号"["开始,并以中括号"]"结束,并且所有的值使用逗号分隔,例如:

var userlist = [{"user":{"name":"anbgsl1110","gender":"Male","birthday":"1993-06-13"}}, 
{"user":{"name":"slht","Male":"Female","birthday":"1995-11-10"}}]

1.2.3 字符串

任意数量的Unicode字符,使用引号做标记,并使用反斜杠来分隔。例如:

var userlist = "{\"ID\":1,\"Name\":\"anbgsl1110\",\"Address\":\"kx\"}" 

2 性能

jsonPerformance.png

3 Json的序列化和反序列化帮助类(Newtonsoft.Json(Json.Net)为例)

3.1 Json序列化和反序列化的简单封装

/// <summary>
/// Json帮助类
/// </summary>
public class JsonHelper
{
    /// <summary>
    /// 将对象序列化为JSON格式
    /// </summary>
    /// <param name="o">对象</param>
    /// <returns>json字符串</returns>
    public static string SerializeObject(object o)
    {
        string json = JsonConvert.SerializeObject(o);
        return json;
    }

    /// <summary>
    /// 解析JSON字符串生成对象实体
    /// </summary>
    /// <typeparam name="T">对象类型</typeparam>
    /// <param name="json">json字符串</param>
    /// <returns>对象实体</returns>
    public static T DeserializeJsonToObject<T>(string json) where T : class
    {
        JsonSerializer serializer = new JsonSerializer();
        StringReader sr = new StringReader(json);
        object o = serializer.Deserialize(new JsonTextReader(sr), typeof(T));
        T t = o as T;
        return t;
    }

    /// <summary>
    /// 解析JSON数组生成对象实体集合
    /// </summary>
    /// <typeparam name="T">对象类型</typeparam>
    /// <param name="json">json数组字符串</param>
    /// <returns>对象实体集合</returns>
    public static List<T> DeserializeJsonToList<T>(string json) where T : class
    {
        JsonSerializer serializer = new JsonSerializer();
        StringReader sr = new StringReader(json);
        object o = serializer.Deserialize(new JsonTextReader(sr), typeof(List<T>));
        List<T> list = o as List<T>;
        return list;
     }

     /// <summary>
     /// 反序列化JSON到给定的匿名对象.
     /// </summary>
     /// <typeparam name="T">匿名对象类型</typeparam>
     /// <param name="json">json字符串</param>
     /// <param name="anonymousTypeObject">匿名对象</param>
     /// <returns>匿名对象</returns>
     public static T DeserializeAnonymousType<T>(string json, T anonymousTypeObject)
     {
        T t = JsonConvert.DeserializeAnonymousType(json, anonymousTypeObject);
        return t;
     }
   }

3.2 注意点

  • 通常使用调用实体序列化SerializeObject()和反序列化DeserializeJsonToObject()两个方法就可以了。但有些情况下我们解析json字符串时,可能没有对应的实体类型(或者说不想添加对应的实体类),这时候可以用匿名对象解析方法DeserializeAnonymousType()。
  • Json的两种结构数组和对象解析时略有不同。Json对象一般转换成实体,Json数组一般转换成实体集合。

4 其他参考