문자열 값이 동일한 이름의 개체에 래핑 된 JSON을 명확하게 역 직렬화하는 방법

도메인

이상한 JSON을 C # 클래스로 역 직렬화하고 싶습니다.

{
    "Result": {
        "Client": {
            "ProductList": {
                "Product": [
                    {
                        "Name": {
                            "Name": "Car polish"
                        }
                    }
                ]
            },
            "Name": {
                "Name": "Mr. Clouseau"
            },
            "AddressLine1": {
                "AddressLine1": "Hightstreet 13"
            }
        }
    }
}

json2csharp 는 JSON에 대해 다음 클래스를 생성합니다.

public class Name
{
    public string Name { get; set; }
}

public class Product
{
    public Name Name { get; set; }
}

public class ProductList
{
    public List<Product> Product { get; set; }
}

public class Name2
{
    public string Name { get; set; }
}

public class AddressLine1
{
    public string AddressLine1 { get; set; }
}

public class Client
{
    public ProductList ProductList { get; set; }
    public Name2 Name { get; set; }
    public AddressLine1 AddressLine1 { get; set; }
}

public class Result
{
    public Client Client { get; set; }
}

public class RootObject
{
    public Result Result { get; set; }
}

문제는 객체 ( Namein ProductClient, AddressLine1in Client) 의 중복 된 속성 이름으로 인해 JSON을 역 직렬화 할 수 있도록 하나의 문자열 속성 ( Name, AddressLine1) 만있는 추가 클래스를 생성 해야한다는 것입니다.

생성 된 코드도 유효하지 않습니다. 멤버 이름이 둘러싸는 유형과 같을 수 없기 때문입니다 (하지만 [JsonProperty(PropertyName = "Name")]속성을 사용하여 해결할 수 있음을 알고 있습니다 ).

클래스 계층 구조에서 불필요한 수준을 피하고 JSON.NET을 사용하여이 JSON을 역 직렬화 할 수있는 깨끗한 클래스 구조를 갖는 가장 좋은 방법은 무엇입니까? 이것은 타사 API이므로 JSON 만 변경할 수는 없습니다.

브라이언 로저스

실제로 이것은 API 결과에 대해 이상한 형식이므로 소비하기가 더 어렵습니다. 문제를 해결하기위한 한 가지 아이디어 JsonConverter는 래퍼가없는 것처럼 래핑 된 값을 가져와 내부 값을 반환 할 수 있는 사용자 지정을 만드는 것입니다. 이렇게하면 투박한 JSON을보다 합리적인 클래스 계층 구조로 역 직렬화 할 수 있습니다.

작동해야하는 변환기는 다음과 같습니다.

class WrappedObjectConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return true;
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JToken token = JToken.Load(reader);
        // Get the value of the first property of the inner object
        // and deserialize it to the requisite object type
        return token.Children<JProperty>().First().Value.ToObject(objectType);
    }

    public override bool CanWrite
    {
        get { return false; }
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

이 변환기로 무장하면 추가 수준의 중첩을 제거하는 클래스 계층 구조를 만들 수 있습니다. [JsonConverter]Json.Net이 사용자 지정 변환기를 적용 할시기를 알 수 있도록 속성 으로 "언 래핑"되어야하는 속성을 표시해야합니다 . 다음은 향상된 클래스 구조입니다.

public class RootObject
{
    public Result Result { get; set; }
}

public class Result
{
    public Client Client { get; set; }
}

public class Client
{
    [JsonConverter(typeof(WrappedObjectConverter))]
    public List<Product> ProductList { get; set; }

    [JsonConverter(typeof(WrappedObjectConverter))]
    public string Name { get; set; }

    [JsonConverter(typeof(WrappedObjectConverter))]
    public string AddressLine1 { get; set; }
}

public class Product
{
    [JsonConverter(typeof(WrappedObjectConverter))]
    public string Name { get; set; }
}

( Result객체에을 제외한 다른 속성이 포함되지 않은 경우 Client를 적용 WrappedObjectConverter하여를 Client위로 이동 RootObject하고 Result클래스를 제거 할 수 있습니다.)

다음은 작동중인 변환기를 보여주는 데모입니다.

class Program
{
    static void Main(string[] args)
    {
        string json = @"
        {
            ""Result"": {
                ""Client"": {
                    ""ProductList"": {
                        ""Product"": [
                            {
                                ""Name"": {
                                    ""Name"": ""Car polish""
                                }
                            }
                        ]
                    },
                    ""Name"": {
                        ""Name"": ""Mr. Clouseau""
                    },
                    ""AddressLine1"": {
                        ""AddressLine1"": ""Hightstreet 13""
                    }
                }
            }
        }";

        RootObject obj = JsonConvert.DeserializeObject<RootObject>(json);

        Client client = obj.Result.Client;
        foreach (Product product in client.ProductList)
        {
            Console.WriteLine(product.Name);
        }
        Console.WriteLine(client.Name);
        Console.WriteLine(client.AddressLine1);
    }
}

산출:

Car polish
Mr. Clouseau
Hightstreet 13

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

하나의 클래스에서 가능한 여러 개체 이름으로 JSON 문자열 역 직렬화

분류에서Dev

C #에서 클래스 개체를 JSON 문자열로 직렬화하는 동안 키 이름을 동적으로 설정하는 방법

분류에서Dev

중첩 된 개체에 이름이있을 때 XML을 역 직렬화하는 방법

분류에서Dev

클래스 문자열 값으로 개체를 역 직렬화하는 방법

분류에서Dev

JSON 파일에서 .NET Core의 캡슐화 된 개체 테이블을 역 직렬화하는 방법은 무엇입니까?

분류에서Dev

클래스 이름을 동적 값으로 사용하여 json을 역 직렬화하는 방법

분류에서Dev

동일한 이름의 새 개체로 개체를 역 직렬화하는 방법은 무엇입니까?

분류에서Dev

CSV 파일에서 JSON 쉼표로 구분 된 문자열을 역 직렬화하는 방법

분류에서Dev

Json.NET은 json 문자열을 역 직렬화 또는 직렬화하고 속성을 런타임에 정의 된 다른 속성 이름에 매핑합니다.

분류에서Dev

Play의 json을 사용하여 동적 필드 이름을 직렬화 / 역 직렬화하는 방법

분류에서Dev

파일 입력에서 JSON 문자열을 역 직렬화하는 방법

분류에서Dev

JSON 문자열을 객체로 역 직렬화하는 방법

분류에서Dev

중첩 된 json 문자열을 역 직렬화하면 null 값이됩니다.

분류에서Dev

Newtonsoft.Json 라이브러리를 사용하여 문자열을 C #을 사용하여 사용자 지정 개체로 역 직렬화하는 방법

분류에서Dev

json 배열과 일반 속성을 jackson의 pojo로 역 직렬화하는 방법. 어레이 만 작동

분류에서Dev

면도기 페이지, json 직렬화 된 문자열을 모델 속성에 전달하는 방법

분류에서Dev

C #에서 과학적 표기법없이 문자열을 JObject로 역 직렬화하는 방법

분류에서Dev

C #에서 테이블과 값으로 JSON을 역 직렬화하는 방법

분류에서Dev

변수 이름과 배열로 JSON을 역 직렬화하는 방법

분류에서Dev

직렬화 가능한 객체의 배열로 클래스를 역 직렬화하는 방법

분류에서Dev

Newtonsoft.JSON으로 동적 JSON을 구문 분석하는 중 역 직렬화 된 객체에 배열이 없습니다.

분류에서Dev

mvc4의 컨트롤러에 Json 문자열을 보내고 json을 역 직렬화하는 방법

분류에서Dev

C #에서 동적 및 정적 키 이름으로 JSON을 역 직렬화하는 방법

분류에서Dev

json 문자열에 따라 객체를 생성하는 방법, 아래에 나와 있으며 Google 번역의 API이며 C #에서 역 직렬화하는 방법

분류에서Dev

다양한 데이터 유형을 포함하는 JSON 배열을 단일 객체로 역 직렬화하는 방법

분류에서Dev

일리노이 에디슨을 사용하여 직렬화 / 역 직렬화하는 방법

분류에서Dev

단일 속성 이름과 값을 각각 가진 개체 배열을 포함하는 JSON을 ac # 모델로 역 직렬화하는 방법은 무엇입니까?

분류에서Dev

단일 속성 이름과 값을 각각 가진 개체 배열을 포함하는 JSON을 ac # 모델로 역 직렬화하는 방법은 무엇입니까?

분류에서Dev

키와 해당 값이 배열 값인 객체에 매핑 된 문자열 배열을 입력하는 방법

Related 관련 기사

  1. 1

    하나의 클래스에서 가능한 여러 개체 이름으로 JSON 문자열 역 직렬화

  2. 2

    C #에서 클래스 개체를 JSON 문자열로 직렬화하는 동안 키 이름을 동적으로 설정하는 방법

  3. 3

    중첩 된 개체에 이름이있을 때 XML을 역 직렬화하는 방법

  4. 4

    클래스 문자열 값으로 개체를 역 직렬화하는 방법

  5. 5

    JSON 파일에서 .NET Core의 캡슐화 된 개체 테이블을 역 직렬화하는 방법은 무엇입니까?

  6. 6

    클래스 이름을 동적 값으로 사용하여 json을 역 직렬화하는 방법

  7. 7

    동일한 이름의 새 개체로 개체를 역 직렬화하는 방법은 무엇입니까?

  8. 8

    CSV 파일에서 JSON 쉼표로 구분 된 문자열을 역 직렬화하는 방법

  9. 9

    Json.NET은 json 문자열을 역 직렬화 또는 직렬화하고 속성을 런타임에 정의 된 다른 속성 이름에 매핑합니다.

  10. 10

    Play의 json을 사용하여 동적 필드 이름을 직렬화 / 역 직렬화하는 방법

  11. 11

    파일 입력에서 JSON 문자열을 역 직렬화하는 방법

  12. 12

    JSON 문자열을 객체로 역 직렬화하는 방법

  13. 13

    중첩 된 json 문자열을 역 직렬화하면 null 값이됩니다.

  14. 14

    Newtonsoft.Json 라이브러리를 사용하여 문자열을 C #을 사용하여 사용자 지정 개체로 역 직렬화하는 방법

  15. 15

    json 배열과 일반 속성을 jackson의 pojo로 역 직렬화하는 방법. 어레이 만 작동

  16. 16

    면도기 페이지, json 직렬화 된 문자열을 모델 속성에 전달하는 방법

  17. 17

    C #에서 과학적 표기법없이 문자열을 JObject로 역 직렬화하는 방법

  18. 18

    C #에서 테이블과 값으로 JSON을 역 직렬화하는 방법

  19. 19

    변수 이름과 배열로 JSON을 역 직렬화하는 방법

  20. 20

    직렬화 가능한 객체의 배열로 클래스를 역 직렬화하는 방법

  21. 21

    Newtonsoft.JSON으로 동적 JSON을 구문 분석하는 중 역 직렬화 된 객체에 배열이 없습니다.

  22. 22

    mvc4의 컨트롤러에 Json 문자열을 보내고 json을 역 직렬화하는 방법

  23. 23

    C #에서 동적 및 정적 키 이름으로 JSON을 역 직렬화하는 방법

  24. 24

    json 문자열에 따라 객체를 생성하는 방법, 아래에 나와 있으며 Google 번역의 API이며 C #에서 역 직렬화하는 방법

  25. 25

    다양한 데이터 유형을 포함하는 JSON 배열을 단일 객체로 역 직렬화하는 방법

  26. 26

    일리노이 에디슨을 사용하여 직렬화 / 역 직렬화하는 방법

  27. 27

    단일 속성 이름과 값을 각각 가진 개체 배열을 포함하는 JSON을 ac # 모델로 역 직렬화하는 방법은 무엇입니까?

  28. 28

    단일 속성 이름과 값을 각각 가진 개체 배열을 포함하는 JSON을 ac # 모델로 역 직렬화하는 방법은 무엇입니까?

  29. 29

    키와 해당 값이 배열 값인 객체에 매핑 된 문자열 배열을 입력하는 방법

뜨겁다태그

보관