是否有 System.Text.Json 替代 Json.NET 的 JsonProperty(Order)?
Posted
技术标签:
【中文标题】是否有 System.Text.Json 替代 Json.NET 的 JsonProperty(Order)?【英文标题】:Is there a System.Text.Json's substitute for Json.NET's JsonProperty(Order)? 【发布时间】:2020-01-28 16:37:13 【问题描述】:由于System.Text.Json
现在是.NET Core 3.0 的 JSON 库,是否有匹配 Json.NET 的 JsonProperty(Order)
的属性/参数?我浏览了扩展 System.Text.Json.Serialization.JsonAttribute
的类,但似乎没有一个能达到这个目的。
通过JsonSerializer.Write.HandleObject.cs
等并没有向我展示任何可以直接替换此处的旧属性的内容。我错过了什么吗?如果没有,在这里复制遗留行为的最简单方法是什么?
【问题讨论】:
我不知道答案,但是在查看了代码之后,我猜 JsonClassInfo.CreatePropertyCache() 中需要一个更复杂的比较器 如果您实际上不需要 Json.NET 的更高级功能,它只是 .NET Core 3 的 JSON 库。System.Text.Json
是其他框架和库以及不需要多余装饰的客户端的坚实执行基础,但期望每个客户端场景都映射到它而不需要(可能是大量的)额外努力要求太多。对于应用程序作者,我还不会将 Json.NET 称为“遗留”... TL;DR:如果您为它编写代码并提交拉取请求,将会有替代品,但可能不会早于此。
@JeroenMostert 这不是我的意见 - 这是微软的官方意见(尤其重要,例如 ASP.NET);成为 Json.NET 的替代品是他们的官方目标之一,他们明确地吹嘘它。不过,我部分同意 tl;dr 部分 - 直到有人报告缺少某个功能,实现可能不会出现。无论好坏,这在某种程度上都是由社区驱动的。
在微软自己的场景中成为 Json.NET 的直接目标绝对是一个目标,但他们也state 认为性能将优先于功能,因此(例如)将 JSON 映射到dynamic
(另一个 Json.NET 功能)可能永远不会在基本 API 中占有一席之地,而被归入扩展包。而且,如果 ASP.NET 目前不需要按顺序编写属性的能力(符合标准的解析器不需要),那么这同样可能最终在优先级列表中非常低,如果有的话。
此功能的可取之处在于,由于属性从语义上开始没有排序,实际上添加排序应该相对便宜,因此实现它不太可能与任何性能目标发生冲突。
【参考方案1】:
当前版本的 System.Text.Json 不直接支持 Json.NET 的 JsonProperty(Order)。但是,您可以为此创建一个JsonConverter。
实现此目的的示例:.NET core 3: Order of serialization for JsonPropertyName (System.Text.Json.Serialization)
【讨论】:
以上是关于是否有 System.Text.Json 替代 Json.NET 的 JsonProperty(Order)?的主要内容,如果未能解决你的问题,请参考以下文章
System.Text.Json API 有类似 IContractResolver 的东西
将 Newtonsoft.Json 代码迁移到 System.Text.Json
使用 System.Text.Json 有条件地将对象序列化为单个字符串
Swagger UI 不使用 Newtonsoft.Json 序列化十进制,而是使用 System.Text.json