> 백엔드 개발 > C++ > .NET Core에서 유형 차별을 사용하여 중첩된 JSON을 중첩된 사전으로 역직렬화하는 방법은 무엇입니까?

.NET Core에서 유형 차별을 사용하여 중첩된 JSON을 중첩된 사전으로 역직렬화하는 방법은 무엇입니까?

DDD
풀어 주다: 2024-12-29 08:04:13
원래의
892명이 탐색했습니다.

How to Deserialize Nested JSON into a Nested Dictionary with Type Discrimination in .NET Core?

중첩 JSON을 중첩 사전으로 역직렬화 유형 차별 사용

.NET Core 3.1에서 System.Text.Json은 JSON을 역직렬화하는 표준 방법을 제공합니다. 기본적으로 JSON 객체는 JSON 데이터 구조에 대한 액세스를 제공하지만 값을 해당 C# 유형으로 자동 변환하지 않는 JsonElement 객체로 역직렬화됩니다.

문제:

목표는 중첩된 JSON 개체를 Dictionary로 역직렬화하는 것이지만 JSON 속성에 대해 다음과 같은 유형 구별을 사용합니다. 값:

  • 문자열을 문자열로
  • 숫자를 int/double로
  • 객체를 사전

해결책:

달성하려면 System.Text.Json은 이 특정 유형 변환에 대해 기본 기능을 제공하지 않으므로 ObjectAsPrimitiveConverter라는 사용자 지정 JsonConverter가 필요합니다.

ObjectAsPrimitiveConverter는 다음 기능을 제공합니다.

  • 유형 인식 deserialization:

    • 문자열을 문자열로 변환
    • 사용자 구성 가능한 형식에 따라 숫자를 int/double로 변환
    • 객체를 사전<문자열로 변환, object>
  • 숫자 처리:

    • 부동 소수점 숫자에 대한 배정밀도 또는 소수점 정밀도 지원
    • 지원되지 않는 숫자를 JsonElements로 처리하거나 throw하는 옵션이 포함되어 있습니다. 예외
  • 객체 처리:

    • 사용자가 사전<문자열, 객체> 또는 객체용 ExpandoObject

구현:

public class ObjectAsPrimitiveConverter : JsonConverter<object>
{
    // Configuration options
    FloatFormat FloatFormat { get; init; }
    UnknownNumberFormat UnknownNumberFormat { get; init; }
    ObjectFormat ObjectFormat { get; init; }

    public ObjectAsPrimitiveConverter()
        : this(FloatFormat.Double, UnknownNumberFormat.Error, ObjectFormat.Expando)
    {
    }

    public ObjectAsPrimitiveConverter(
        FloatFormat floatFormat,
        UnknownNumberFormat unknownNumberFormat,
        ObjectFormat objectFormat)
    {
        this.FloatFormat = floatFormat;
        this.UnknownNumberFormat = unknownNumberFormat;
        this.ObjectFormat = objectFormat;
    }

    // ... implementation details ...
}

public enum FloatFormat
{
    Double,
    Decimal,
}

public enum UnknownNumberFormat
{
    Error,
    JsonElement,
}

public enum ObjectFormat
{
    Expando,
    Dictionary,
}
로그인 후 복사

사용법:

JSON을 동적 개체(또는 구성된 경우 ExpandoObject)로 역직렬화하려면 ObjectAsPrimitiveConverter를 사용하여 다음과 같이 JsonSerializerOptions에 변환기를 지정합니다.

var options = new JsonSerializerOptions
{
    Converters = { new ObjectAsPrimitiveConverter(floatFormat : FloatFormat.Double, unknownNumberFormat : UnknownNumberFormat.Error, objectFormat : ObjectFormat.Expando) },
    WriteIndented = true,
};
dynamic d = JsonSerializer.Deserialize<dynamic>(json, options);
로그인 후 복사

참고:

  • JSON은 임의의 정밀도와 크기를 허용합니다. .NET 기본 숫자 유형은 그렇지 않습니다. JSON 숫자를 .NET 기본 유형으로 구문 분석할 수 없는 경우 변환기는 숫자에 대해 JsonElement를 반환하거나 예외를 발생시키는 옵션을 제공합니다.
  • 이중 정밀도 또는 소수 정밀도를 사용하도록 변환기를 구성할 수 있습니다. 부동 소수점 숫자 및 Dictionary 또는 JSON 개체의 경우 ExpandoObject.

위 내용은 .NET Core에서 유형 차별을 사용하여 중첩된 JSON을 중첩된 사전으로 역직렬화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿