强制 Blazor webassembly 在客户端使用 Newtonsoft.Json
Posted
技术标签:
【中文标题】强制 Blazor webassembly 在客户端使用 Newtonsoft.Json【英文标题】:Enforcing Blazor webassembly to use Newtonsoft.Json on client side 【发布时间】:2020-09-19 12:12:35 【问题描述】:在 Blazor webassembly 中,有一种方法可以强制对 httpclient 和 GetJsonAsync、PostAsJsonAsync 等方法使用 Newtonsoft.Json 序列化。
或者唯一的方法是编写辅助方法并使用 GetAsync,然后使用 Newtonsoft.Json 手动序列化响应?
【问题讨论】:
【参考方案1】:有没有办法强制将 Newtonsoft.Json 用于... PostAsJsonAsync 等。
没有。最近这种情况发生了一些变化,尤其是对于 Blazor。但是 System.Net.Http.Json.HttpClientJsonExtensions 现在直接依赖 System.Text.Json,不可插拔。
所以是的,您必须编写自己的助手,这没什么大不了的。链接器甚至可能会删除发布版本中的 System.Text.Json 类,我不确定。
但反面的问题当然是你为什么需要这个? NewtonSoft 从现在开始就是旧版,如果您确实有不兼容的数据,可能会询问您是否可以使用一些 System.Text 选项来解决这个问题。
【讨论】:
嗯,使用 [JsonProperty("model")] [JsonConverter(typeof(StringEnumConverter))] 等属性对我非常有用。我不知道还有其他选择,但是在您的回答之后,您让我思考。我找到了以下链接devblogs.microsoft.com/dotnet/try-the-new-system-text-json-apis 看起来有一个合适的选择 问题是 System.Text.Json 在很大程度上仍然是一个燃烧的垃圾火。它不支持特定于语言的东西,例如 TypeConverters。这应该早在他们开始之前就已经完成了,更不用说推出已发布的产品了。 我现在进入了这个问题,System.Text.Json 不支持[JsonConstructor]
属性。所以现在我必须为我所有的 DTO 配备公共二传手。是的,当然,我可以这样做,但这会破坏 DTO 的预期不变性。我当然不会按照官方的建议 (docs.microsoft.com/en-us/dotnet/standard/serialization/…) 编写自己的解析器。
除非我弄错了 System.Text.Json.JsonIgnoreAttribute 不适用于 .Net Standard 2.1。我在 Blazor 应用程序中似乎可以引用的唯一 JsonIgnoreAttribute 是 Newtonsoft ,而 System.Text.Json / System.Net.Http.Json 忽略了该属性,因此我目前无法从序列化中排除属性。我正在通过使属性受到保护并重写调用代码以通过中介来解决它,这显然很有趣。
NewtonSoft 仍然有一些优势 - 就我而言,我想反序列化为 Dictionary<string, object>
以创建 ExpandoObject
。 System.Text.Json
反序列化为 JsonElement
而 Json.Net 反序列化为匿名,这正是我想要的。以上是关于强制 Blazor webassembly 在客户端使用 Newtonsoft.Json的主要内容,如果未能解决你的问题,请参考以下文章
Blazor WebAssembly Server 项目如何引用客户端索引?
Blazor WebAssembly Server 项目如何引用客户端索引?
如何在运行时在 Blazor WebAssembly 客户端应用程序中使用 Azure 应用设置作为 appsettings.json 配置?