Blazor 웹 어셈블리 앱에 JsonConvertorFactory 추가

Sep 14 2020

Blazor의 새로운 기능, 웹 어셈블리의 새로운 기능, .NET Core의 새로운 기능 (1.0 이후).

저는 Blazor를 배우기 위해 몇 가지 첫 걸음을 내딛고 있습니다. 저는 대부분 클라이언트 측이 아닌 백엔드 및 winforms 개발자입니다.

내 프로젝트의 경우 Azure Functions 3을 통해 배포 한 일부 기존 기능에 액세스하는 Blazor 웹 어셈블리 클라이언트를 구축하고 있습니다. 프런트 엔드 및 백 엔드 앱간에 일부 POCO를 공유하고 싶습니다.

Blazor 앱과 Azure Functions 앱간에 "임피던스 불일치"가 발생합니다. 두 앱 (Blazor 및 Functions)은 모두 기본 "즉시 사용 가능한"앱으로, VS2019의 새 프로젝트 템플릿에서 만든 방식으로 구성됩니다.

  • Azure Functions 앱은 "netcoreapp3.1"을 대상으로하고 Blazor 클라이언트 쪽 앱은 "netstandard2.1"을 대상으로합니다.
  • Newtonsoft.JsonBlazor가 사용 하는 동안 Azure Functions 사용System.Text.Json

객체 정의를 공유하기 위해 POCO가 포함 된 클래스 라이브러리를 netstandard2.1로 변경했는데 괜찮은 것 같습니다. 이것이 올바른 해결책 이었습니까?

극복 할 수 없었던 문제는 다음과 같습니다. enum속성 을 포함하는 개체가 Azure Functions 앱에서 반환됩니다. JSON 텍스트에서 열거 형 값이 발견되면 Blazor 앱에서이 개체의 역 직렬화가 실패합니다.

속성 System.Text.Json을 역 직렬화하려면 어떻게 enum해야합니까?

JsonConvertorFactoryASP.NET Core에을 추가하는 방법에 대한 예제를 보았지만 이러한 예제가 Blazor 앱 내부에 적용되는 방법이나 여부는 명확하지 않습니다. 예를 들어 여기 .

온 Newtsoft.Json측의 포항 강판은으로 장식되어 Newtonsoft.Json.JsonConvertor속성. 해당 System.Text.Json변환기 속성을 추가하려고 했지만 해당 클래스를 찾을 수 System.Text.Json없습니다. netstandard2.1의 일부가 아닙니까?

답변

2 HenkHolterman Sep 14 2020 at 03:53

내 POCO가 포함 된 클래스 라이브러리를 netstandard2.1로 변경했는데 괜찮은 것 같습니다. 이것이 올바른 해결책 이었습니까?

네, 괜찮습니다.

그리고 Blazor 앱에 NewtonSoft를 추가 할 수 있다는 것을 알고 있습니다. 크기가 약간만 추가됩니다.

반면에 Azure Functions가 NewtonSoft에 그렇게 강력하게 연결되어 있는지 잘 모르겠습니다. HttpRequest 및 HttpResponse로 작업하지 않습니까? System.Text.Json에서도 작동해야합니다.

따라서 양쪽에서 동일한 Json lib를 사용할 수 있어야합니다.

System.Text.Json은 netstandard2.1의 일부가 아닙니까?

'일부'가 아니라 '지원'입니다. 프로젝트에 올바른 패키지를 추가하여이 문제를 해결할 수 있습니다 (여전히 필요한 경우).

CarlDaniel Sep 14 2020 at 11:29

첫째, 내가 말할 수있는 것처럼 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?)에 대한 null 값이라고 생각 했지만 잘못되었습니다-NaN 값입니다-분명히 Newstonsoft.Json그 값을 이해하지만 System.Text.Json그렇지 않습니다. 내 데이터 소스의 버그를 고려하여 NaN을 반환하지 않도록 수정하겠습니다 (이것이 속성이 double?결국 발생 하는 이유입니다 ).

업데이트 소스 코드를 살펴보면 HttpClientJsonExtensions.GetFromJsonAsync설정할 수있는 전역 기본값이 없음이 분명합니다. JsonSerializerOptions모든 호출 에 a 를 전달하는 위의 솔루션은 GetFromJsonAsync현재 올바른 솔루션 으로 보입니다.