Newtonsoft技巧/与System.Text.Json的对比

7 阅读2分钟

.Net的Json序列化库中, 首选Newtonsoft、

但微软维护的System.Text.Json也有优势的方面;现时点的pros/cons比较如下:

Newtonsoft JsonSystem.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型的整数转换后,带上.0Booleantrue转成"是")
//则可以通过继承JsonConverter,自定义类型
//共通的规则,实现全局序列化设置(避免分别设置的麻烦)
Newtonsoft.Json.JsonConvert.DefaultSettings = () =>
{
    ... ...
}
//合并多个json到一个Model
JsonConvert.PopulateObject(json1, xxxModel);
JsonConvert.PopulateObject(json2,  xxxModel);

【参照】

www.newtonsoft.com/json/help/h…

www.cnblogs.com/thomerson/p…

www.pianshen.com/article/661…

qiita.com/jun1s/items…

www.thinbug.com/q/51086115

dotblogs.com.tw/AceLee/2018…

zhuanlan.zhihu.com/p/149758306

www.cnblogs.com/Lulus/p/169…

qiita.com/tkt989/item…

www.cnblogs.com/yibinboy/p/…

www.nextdoorwith.info/wp/se/net-c…