> 백엔드 개발 > C++ > Newtonsoft.Json을 사용하여 동적 숫자 키로 JSON을 역직렬화하는 방법은 무엇입니까?

Newtonsoft.Json을 사용하여 동적 숫자 키로 JSON을 역직렬화하는 방법은 무엇입니까?

DDD
풀어 주다: 2025-01-13 19:07:44
원래의
693명이 탐색했습니다.

How to Deserialize JSON with Dynamic Numeric Keys Using Newtonsoft.Json?

동적(숫자) 키 이름을 사용하여 하위 개체를 역직렬화하는 방법은 무엇입니까?

동적 키 이름이 있는 하위 개체가 포함된 복잡한 JSON 구조를 처리할 때 Newtonsoft JSON.NET을 사용하여 역직렬화하면 문제가 발생할 수 있습니다. 이 기사에서는 이러한 구조와 관련된 시나리오를 자세히 살펴보고 사용자 지정 JSON 변환기를 사용하여 완전한 솔루션을 제공합니다.

JSON 구조

다음 JSON 구조를 고려하세요.

<code class="language-json">{
    "users" : {
        "parentname":"test",
        "100034" : {
            "name"  : "tom",
            "state" : "WA",
            "id"    : "cedf-c56f-18a4-4b1"
        },
        "10045" : {
            "name"  : "steve",
            "state" : "NY",
            "id"    : "ebb2-92bf-3062-7774"
        },
        "12345" : {
            "name"  : "mike",
            "state" : "MA",
            "id"    : "fb60-b34f-6dc8-aaf7"
        }
    }
}</code>
로그인 후 복사

이 구조에서 "users" 개체에는 알려진 속성("parentname")과 알 수 없는 속성(하위 개체를 나타내는 숫자 키 포함)이 혼합되어 있습니다. 목표는 이 구조를 하위 개체가 강력한 형식의 클래스로 표시되는 C# 개체 모델로 역직렬화하는 것입니다.

초기 시도와 도전

표준 JSON.NET 코드를 사용하여 JSON을 역직렬화하려는 초기 시도는 다음과 같습니다.

<code class="language-csharp">class RootObject
{
    public string ParentName { get; set; }
    public Dictionary<string, User> users { get; set; }
}

class User
{
    public string name { get; set; }
    public string state { get; set; }
    public string id { get; set; }
}</code>
로그인 후 복사

"사용자" 개체의 알 수 없는 속성으로 인해 이 개체 모델에 대한 역직렬화가 실패합니다. 기본적으로 JSON.NET에서는 속성 이름이 클래스 속성과 일치할 것으로 예상하고 숫자 키가 User 클래스의 어떤 속성과도 일치하지 않으므로 역직렬화 프로세스가 실패합니다.

맞춤형 JSON 변환기

이 문제를 해결하려면 맞춤형 JSON 변환기가 필요합니다. TypedExtensionDataConverter이 문제를 우아하게 해결합니다. 코드는 다음과 같습니다.

<code class="language-csharp">public class TypedExtensionDataConverter<T> : JsonConverter
{
    // ... [此处省略实现,篇幅原因]
}</code>
로그인 후 복사

이 변환기를 사용하면 알 수 없는 속성을 유형이 지정된 컨테이너(이 경우 사용자 개체 사전)로 역직렬화할 수 있습니다.

<code class="language-csharp">[JsonConverter(typeof(TypedExtensionDataConverter<Users>))]
class Users
{
    public Users()
    {
        this.UserTable = new Dictionary<string, User>();
    }

    [JsonProperty("parentname")]
    public string ParentName { get; set; }

    [JsonTypedExtensionData]
    public Dictionary<string, User> UserTable { get; set; }
}</code>
로그인 후 복사

JsonTypedExtensionDataAttribute을 사용하여 변환기는 알 수 없는 속성을 UserTable 사전에 직렬화/역직렬화하는 방법을 알고 있습니다.

완벽한 솔루션

맞춤형 변환기를 사용하면 전체 솔루션은 다음과 같습니다.

<code class="language-csharp">class RootObject
{
    [JsonProperty("users")]
    public Users Users { get; set; }
}

[JsonConverter(typeof(TypedExtensionDataConverter<Users>))]
class Users
{
    // ... [如上实现]
}

class User
{
    // ... [不变]
}</code>
로그인 후 복사

역직렬화된 JSON 구조는 이제 RootObject 개체 내의 Users 사전에 저장된 하위 개체를 포함하여 예상 값으로 UserTable를 채웁니다.

위 내용은 Newtonsoft.Json을 사용하여 동적 숫자 키로 JSON을 역직렬화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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