Newtonsoft.Json 的高级用法

Ø  简介

接着前一篇http://www.cnblogs.com/abeam/p/8295765.html,继续研究 Newtonsoft.Json 的一些高级用法。主要包括:

1.   JSON 格式化

2.   忽略指定成员

3.   忽略默认值成员

4.   忽略空值(null)成员

5.   驼峰命名序列化成员

6.   日期类型格式化

7.   解决序列化对象循环引用

 

Ø  首先,准备数据

Goods[] goods = new Goods[]

{

    new Goods()

    {

        GoodsId = 1,

        GoodsName = "联想ThinkPad无线鼠标",

        //Price = 125.00m,

        //IsQuota = true,

        Attributes = new Goods.Attribute[]

        {

            new Goods.Attribute() { Name = "品牌", Value = "Lenovo/联想" },

            new Goods.Attribute() { Name = "颜色", Value = "黑色" }

        },

        Status = Status.Online

    }

};

 

1.   JSON 格式化(可以采用以下2种方式)

1)   简单格式化(推荐)

string jsonStr1_1_1 = JsonConvert.SerializeObject(goods, Newtonsoft.Json.Formatting.Indented);

结果:

[

  {

    "GoodsName": "联想ThinkPad无线鼠标",

    "IsQuota": true,

    "Status": "Online"

  }

]

 

2)   使用 Newtonsoft.Json.JsonTextWriter 格式化

JsonSerializer serializer1 = new JsonSerializer();

using (StringWriter textWriter = new StringWriter())

{

    using (JsonTextWriter jsonWriter = new JsonTextWriter(textWriter))

    {

        jsonWriter.Formatting = Newtonsoft.Json.Formatting.Indented;    //默认为Formatting.None

        jsonWriter.Indentation = 4;     //缩进字符数,默认为2

        jsonWriter.IndentChar = ' ';    //缩进字符,默认为' '

        serializer1.Serialize(jsonWriter, goods);

    }

    string jsonStr1_2_1 = textWriter.ToString();

}

结果:

[

    {

        "GoodsName": "联想ThinkPad无线鼠标",

        "IsQuota": true,

        "Status": "Online"

    }

]

 

2.   忽略指定成员

忽略指定序列化成员使用 JsonIgnore 特性,例如(修改 Goods):

/// <summary>

/// 商品名称

/// </summary>

[JsonIgnore]

public string GoodsName { get; set; }

 

1)   序列化

string jsonStr2_1 = JsonConvert.SerializeObject(goods);

结果:[{"IsQuota":true,"Status":"Online"}]

 

2)   反序列化

string jsonStr2_2 = "[{\"GoodsName\": \"联想ThinkPad无线鼠标\",\"IsQuota\":true,\"Status\":\"Online\"}]";

Goods[] jsonObj2_1 = JsonConvert.DeserializeObject<Goods[]>(jsonStr2_2);

结果:

clip_image001

 

3.   忽略默认值成员(忽略 GoodsId Price 这两个默认值)

1)   加入 DefaultValue 特性(修改 goods

/// <summary>

/// 价格

/// </summary>

[System.ComponentModel.DefaultValue(125.00)]

public decimal Price { get; set; }

 

2)   创建 JsonSerializerSettings 对象

goods[0].GoodsId = 0;   //int 类型的本身默认值(0

goods[0].Price = 125;   //加了 System.ComponentModel.DefaultValue 特性的默认值(125

var settings1 = new JsonSerializerSettings();

settings1.DefaultValueHandling = DefaultValueHandling.Ignore;

 

3)   序列化

string jsonStr3_1 = JsonConvert.SerializeObject(goods, settings1);

结果:[{"GoodsName":"联想ThinkPad无线鼠标","IsQuota":true,"Status":"Online"}]

 

4)   反序列化

string jsonStr3_2 = "[{\"GoodsId\":0,\"GoodsName\":\"联想ThinkPad无线鼠标\",\"Price\":125,\"IsQuota\":true,\"Status\":\"Online\"}]";

Goods[] jsonObj3_1 = JsonConvert.DeserializeObject<Goods[]>(jsonStr3_2, settings1);

结果:

clip_image002

猜你喜欢

转载自www.cnblogs.com/abeam/p/8930687.html