【问题标题】:Adding a JsonConvertorFactory to a Blazor Web Assembly App将 JsonConverterFactory 添加到 Blazor Webassembly 应用程序
【发布时间】:2020-12-31 12:00:40
【问题描述】:

Blazor 新用户、Web Assembly 新用户、.NET Core 新用户、.NET 新用户(自 1.0 起)。

我正在迈出学习 Blazor 的第一步 - 我主要是后端和 winforms 开发人员,而不是客户端。

对于我的项目,我正在构建一个 Blazor Web Assembly 客户端,该客户端可以访问我通过 Azure Functions 3 部署的一些现有功能。我想在前端和后端应用程序之间共享一些 POCO。

我在 Blazor 应用和 Azure Functions 应用之间遇到了“阻抗不匹配”问题。这两个应用程序(Blazor 和 Functions)都是基本的“开箱即用”应用程序,配置方式与 VS2019 中的新项目模板创建它们的方式相同。

  • Azure 函数应用以“netcoreapp3.1”为目标,而 Blazor 客户端应用以“netstandard2.1”为目标
  • Azure Functions 使用 Newtonsoft.Json 而 Blazor 使用 System.Text.Json

为了共享对象定义,我将包含我的 POCO 的类库更改为 netstandard2.1,这似乎没问题。这是正确的解决方案吗?

我无法克服的问题是:从 Azure Functions 应用返回一个包含 enum 属性的对象。在 JSON 文本中遇到枚举值时,在 Blazor 应用中此对象的反序列化失败。

如何让System.Text.Json 反序列化enum 属性?

我已经看到了如何将 JsonConvertorFactory 添加到 ASP.NET Core 的示例,但不清楚这些示例如何或是否适用于 Blazor 应用程序。例如,here

Newtsoft.Json 一侧,POCO 使用Newtonsoft.Json.JsonConvertor 属性进行装饰。我尝试添加相应的 System.Text.Json 转换器属性,但找不到该类 - System.Text.Json 不是 netstandard2.1 的一部分吗?

【问题讨论】:

    标签: c# asp.net-core json.net blazor blazor-client-side


    【解决方案1】:

    我将包含我的 POCO 的类库更改为 netstandard2.1,这似乎没问题。这是正确的解决方案吗?

    是的,这很好。

    而且我知道您可以将 NewtonSoft 添加到 Blazor 应用程序中,它只会增加一点大小。

    另一方面,我不确定 Azure Functions 是否与 NewtonSoft 有如此紧密的联系,你不只是使用 HttpRequest 和 HttpResponse 吗?这也应该适用于 System.Text.Json。

    所以你应该能够在两边使用相同的 Json 库。

    System.Text.Json 不是 netstandard2.1 的一部分吗?

    不是“部分”,但“支持”。您可以通过将正确的包添加到您的项目来解决此问题(如果仍然需要)。

    【讨论】:

    • 感谢您的意见。如何让 JsonStringEnumConvertor 在 Blazor 方面工作?这确实是目前阻碍我的事情。
    【解决方案2】:

    首先,据我所知,在 Blazor WebAssembly 中没有设置 Json 序列化选项的中心位置 - 最好我可以告诉你,您需要在使用序列化/反序列化的任何地方设置选项 - 希望有人可以消除我的想法如果有什么我错过了(我假设某处有JsonSerializerOptions 选项的默认实例,但我没有找到它)。

    这是基本的解决方案:

              var jso = new System.Text.Json.JsonSerializerOptions()
              {
                  PropertyNameCaseInsensitive = true
              };
              jso.Converters.Add(new System.Text.Json.Serialization.JsonStringEnumConverter());
    
              var sc = await Http.GetFromJsonAsync<YourResultType>(yourUrl, jso);
    

    这样就可以正确解析 enum 值。

    现在遇到一个新问题。我以为Nullable 值类型(例如double?)是空值,但我错了——它是NaN 值——显然Newstonsoft.Json 理解该值而System.Text.Json 不理解。我将考虑我的数据源中的一个错误并将其修复为永远不会返回 NaN(这就是为什么属性毕竟是 double?)。

    更新 查看HttpClientJsonExtensions.GetFromJsonAsync 的源代码,很明显没有可以设置的全局默认值。将JsonSerializerOptions 传递给GetFromJsonAsync 的每次调用的上述解决方案此时似乎是正确的解决方案。

    【讨论】:

    • 如果您想要这种答案,请发布一个新问题,重点关注如何使 NewtonSoft 适应 System.Text。带有特定的示例代码。现在这是一个 Blazor 问题,限制了您的听众。
    猜你喜欢
    • 1970-01-01
    • 2021-09-22
    • 2021-07-21
    • 2020-07-25
    • 2021-10-26
    • 2021-06-28
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    相关资源
    最近更新 更多