【发布时间】:2022-02-11 19:12:40
【问题描述】:
我想通过 JSON 合并补丁 支持部分更新。域模型基于始终有效的概念,没有公共设置器。因此,我不能只将更改应用于类类型。我需要将更改转换为特定命令。
由于类具有可为空的属性,我需要能够区分设置为 null 和未提供的属性。
我知道 JSON 补丁。我可以使用patch.JsonPatchDocument.Operations 浏览更改列表。 JSON Patch 对客户端来说非常冗长且更加困难。 JSON Patch 需要使用Newtonsoft.Json(Microsoft 声明一个选项可以将Startup.ConfigureServices 更改为仅对JSON Patch 使用Newtonsoft.Json (https://docs.microsoft.com/en-us/aspnet/core/web-api/jsonpatch?view=aspnetcore-6.0)。
Newtonsoft 支持 IsSpecified-可用作 DTO 类 (How to make Json.NET set IsSpecified properties for properties with complex values?) 中 JSON 合并补丁解决方案的属性。这将解决问题,但再次需要 Newtonsoft。 System.Text.Json 不支持此功能。有一个未解决的问题 2 年 (https://github.com/dotnet/runtime/issues/40395),但没什么可期待的。
有一篇文章描述了一个带有 custom JsonConverter for Web API (https://github.com/dotnet/runtime/issues/40395) 的解决方案。此解决方案是否仍可用于 NetCore?
我想知道在填充 DTO 对象后是否有一个选项可以访问原始 json 或控制器方法中的 json 对象。然后我可以手动检查是否设置了属性。 Web Api 关闭了流,所以我不能再访问正文了。似乎有办法改变这种行为(https://gunnarpeipman.com/aspnet-core-request-body/#comments)。它看起来很复杂,感觉就像一把太大的枪。我也不明白 NetCore 6 做了哪些更改。
我很惊讶这样一个基本问题需要一个人跳过这么多循环。有没有一种简单的方法可以使用 System.Text.Json 和 NetCore 6 来实现我的目标?还有其他选择吗?使用 Newtonsoft 会有其他不良副作用吗?
【问题讨论】:
-
Optionals 是你的朋友。
-
可选选项是什么意思?我不明白。
-
似乎没有标准实现,但它们是一种通用类型,可让您区分空值和无值。
-
您将在实现中看到的两个常见属性是
HasValue和Value。有一些包可以为你实现这个。 -
Here 是 Roslyn 使用的实现。
标签: json asp.net-core-webapi system.text.json json-patch