.Net的Json序列化库中, 首选Newtonsoft、
但微软维护的System.Text.Json也有优势的方面;现时点的pros/cons比较如下:
| Newtonsoft Json | System.Text.Json |
|---|---|
| 默认选项基本符合大多数人需求 | 要按需设置全局选项 |
| 默认序列化 public field | 默认不序列化 public field |
| 默认忽略大小写 | 默认强制大小写 |
| 尽量避免转义 | 默认转义非 ASCII 字符 |
| 默认支持注释 | 默认不支持注释 |
| 默认支持最后一个逗号 | 默认不支持 |
| 支持的基础类型更广 | 某些类型需要自己实现 |
| 支持多态 | 基本不支持多态 |
| 不支持异步 | 支持异步 |
Newtonsoft Json 简单方便、功能多、性能低。
System.Text.Json 使用复杂、功能少、性能相对高(性能最高的是Swifter.Json)。
※以下是Newtonsoft使用技巧
//标识在类上,表示类中所有public成员会被序列化
[JsonObject(MemberSerialization.OptOut)]
//标识在类上,表示类中所有public成员不会被序列化
[JsonObject(MemberSerialization.OptIn)]
//标识在private属性名上,则可作为序列化对象
[JsonProperty]
//标识在属性名上,表示其与类的整体规则相反
[JsonIgnore]
//序列化时,剔除实体中null值的成员
JsonSerializerSettings jSet =new JsonSerializerSettings();
jSet.NullValueHandling = NullValueHandling.Ignore;
JsonConvert.SerializeObject(obj, Formatting.Indented, jSet);//通过Indeted格式化生成的Json,使其折行显示。
↓↓↓
//或者,标识在属性名上,
[JsonProperty(NullValueHandling=NullValueHandling.Ignore)]
//对日期类型,按指定格式序列化
JsonSerializerSettings jSet =new JsonSerializerSettings();
jSet.DateFormatHandling = Newtonsoft.Json.DateFormatHandling.MicrosoftDateFormat;
jSet.DateFormatString = "yyyy-MM-dd HH:mm:ss";
↓↓↓
//如果是标准格式,也可标识在DataTime类型的属性名上
[JsonConverter(typeof(IsoDateTimeConverter))]
//标识在属性名上,不改变属性名,表示序列化后字段名称
[JsonProperty(PropertyName = "xxxxxx")]
//枚举类的序列化,实现枚举值转换成对应的名称
[JsonConverter(typeof(StringEnumConverter))]
//并不是简单的序列化,还需要有所加工(例如:decimal型的整数转换后,带上.0;Boolean的true转成"是")
//则可以通过继承JsonConverter,自定义类型
//共通的规则,实现全局序列化设置(避免分别设置的麻烦)
Newtonsoft.Json.JsonConvert.DefaultSettings = () =>
{
... ...
}
//合并多个json到一个Model
JsonConvert.PopulateObject(json1, xxxModel);
JsonConvert.PopulateObject(json2, xxxModel);
【参照】
www.newtonsoft.com/json/help/h…