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
的每次调用的解决方案此时似乎是正确的解决方案。