Ø 简介
接着前一篇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);
结果:
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);
结果: