将JsonConvertorFactory添加到Blazor Web Assembly应用程序中



Blazor新手,Web Assembly新手。NET核心,不是新的。NET(自1.0起(.

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

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

我遇到了";阻抗失配";Blazor应用程序和Azure功能应用程序之间。两个应用程序(Blazor和Functions(都是基本的";开箱即用";应用程序,配置了VS2019中新项目模板创建它们的方式。

  • Azure功能应用程序目标"netcoreapp3.1";而Blazor客户端应用程序的目标是";netstandard2.1">
  • Azure函数使用Newtonsoft.Json,而Blazor使用System.Text.Json

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

我一直未能克服的问题是:从Azure函数应用程序返回一个包含enum属性的对象。当JSON文本中遇到枚举值时,Blazor应用程序中此对象的反序列化失败。

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

我看到了如何将JsonConvertorFactory添加到ASP的示例。NET核心,但尚不清楚这些例子是如何或是否适用于Blazor应用程序的。例如,在这里。

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

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

是的,没关系。

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

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

因此,您应该能够在两侧使用相同的Json lib。

是系统。文本Json不是网络标准2.1的一部分?

不是"的一部分",但"上支持"。您可以通过向项目中添加正确的包来解决此问题(如果仍然需要(。

首先,据我所知,在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?(。

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

相关内容

  • 没有找到相关文章

最新更新