newtonsoft를 사용한 API 응답 역 직렬화

JMLilly

응답을 역 직렬화하는 데 도움이 필요합니다. (전화 번호로 Data247에 전화를 걸고 있으며 api는 이동 전화 사업자를 반환합니다). API 호출이 작동하고 다음과 같은 유효한 응답을 받고 있습니다.

{
    "response": {
        "status": "OK",
        "results": [
            {
                "phone": "11234567890",
                "wless": "y",
                "carrier_name": "Blue Licenses Holding, LLC",
                "carrier_id": 6,
                "sms_address": "[email protected]",
                "mms_address": "[email protected]"
            }
        ]
    }
}

이것은 C # .NET winforms 앱에 있습니다. 이를 테스트하려면 Data247의 액세스 키가 있어야합니다. 모든 것이 API 호출을 통해 작동합니다. 내 문제는 다음 줄에 있습니다.

Data247 data247 = JsonConvert.DeserializeObject<Data247>(response.Content);

... 그래서 내 수업이 올바르게 구성되어 있다고 생각하지 않습니다. ... 또는 내가 올바르게 역 직렬화하지 않을 수도 있습니다. 내 코드는 다음과 같습니다.

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Diagnostics;

using RestSharp;
using Newtonsoft.Json;

namespace myTest
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void btnVerify_Click(object sender, EventArgs e)
        {
            try
            {
                string request = txtEndpoint.Text;
                request += "?key=" + txtAccessKey.Text;
                request += "&api=CU";
                request += "&phone=" + txtPhone.Text;
                var client = new RestClient(request);
                var response = client.Execute(new RestRequest());
                Data247 data247 = JsonConvert.DeserializeObject<Data247>(response.Content);

                MessageBox.Show(response.Content);
                Debug.Print(response.Content);
            }
            catch (Exception ex)
            {
                Debug.Print(ex.ToString());
            }
        }

        public class Data247
        {
            Response response { get; set; }
            public class Response
            {
                public string status { get; set; }
                Results results { get; set; }

                public class Results
                {
                    List<Phone> phones = new List<Phone>();
                    public Phone phone { get; set; }
                    public class Phone
                    {
                        public string phone { get; set; }
                        public string wless { get; set; }
                        public string carrier_name { get; set; }
                        public string carrier_id { get; set; }
                        public string sms_address { get; set; }
                        public string mms_address { get; set; }
                    }
                }
            }
        }
    }
}
카렐 타마 요

@Hirasawa의 권장 트릭 외에도이 모든 작동 방식을 이해하는 것이 중요하다고 생각하므로 코드에서 몇 가지 결함을 지적하고 싶습니다.

Phone 클래스가 필요하지 않습니다.

데이터 구조를 보면 전화 번호는 결과 항목의 속성 일뿐입니다. 또한 Results배열이므로 이러한 오류를 수정하기 위해 코드를 업데이트 해 보겠습니다.

public class Data247
{
    Response response { get; set; }

    public class Response
    {
        public string status { get; set; }

        public Results[] results { get; set; }

        public class Results
        {
            public string phone { get; set; }
            public string wless { get; set; }
            public string carrier_name { get; set; }
            public string carrier_id { get; set; }
            public string sms_address { get; set; }
            public string mms_address { get; set; }
        }
    }
}

대상 속성은 공용이어야합니다.

응답을 올바르게 역 직렬화하려면 대상 클래스의 속성이 public 이어야합니다 . 이러한 오류를 수정하면

public class Data247
{
    public Response response { get; set; }

    public class Response
    {
        public string status { get; set; }

        public Results[] results { get; set; }

        public class Results
        {
            public string phone { get; set; }
            public string wless { get; set; }
            public string carrier_name { get; set; }
            public string carrier_id { get; set; }
            public string sms_address { get; set; }
            public string mms_address { get; set; }
        }
    }
}

위의 변경으로 이제 코드가 작동합니다. 글쎄, 거의 ;-). 이제 Results라는 속성의 동일한 수준에 중첩 된 클래스가있는 것으로 나타났습니다 Results. 이것은 C #에서 유효하지 않으며 컴파일러는 "이미 선언 된 Results 멤버가 있습니다." 오류와 함께이를 알려줍니다 . .

수정이 용이하지만, 우리는 단지 외부 범위에 중첩 된 클래스를 이동하거나 우리가 이름을 바꿀 수 ResponseResults같은 것으로 수업을 ResponseDTO하고 ResultDTO,하지만 난 할 이전보다 쉽게 찾을 수 있습니다. 이제 코드는 다음과 같습니다.

public class Data247
{
    public Response response { get; set; }
}

public class Response
{
    public string status { get; set; }

    public Results[] results { get; set; }
}

public class Results
{
    public string phone { get; set; }
    public string wless { get; set; }
    public string carrier_name { get; set; }
    public string carrier_id { get; set; }
    public string sms_address { get; set; }
    public string mms_address { get; set; }
}

보너스 : 관용적 인 C # 코드를 작성합니다.

관용적 코드를 작성하려면 권장 속성 이름을 사용해야합니다. 이것은 스타일과 코드의 문제이지만 코드가 제대로 작성되면 C # 개발자가 감사 할 것입니다.

다음은 내가 할 일에 대한 간략한 요약입니다.

  1. 속성 이름을 UpperCamelCase형식으로 바꿉니다 . 예 : mms_address이어야합니다 MmsAddress.
  2. 1. 때문에 속성을 사용하여 json의 실제 속성 이름을 C # 속성 이름에 매핑해야합니다.

다음은 최종 코드입니다.

public class Data247
{
    [JsonProperty("Response")]
    public Response Response { get; set; }
}

public class Response
{
    [JsonProperty("status")]
    public string Status { get; set; }

    [JsonProperty("results")]
    public Results[] Results { get; set; }
}

public class Results
{
    [JsonProperty("Phone")]
    public string Phone { get; set; }

    [JsonProperty("wless")]
    public string Wless { get; set; }

    [JsonProperty("carrier_name")]
    public string CarrierName { get; set; }

    [JsonProperty("carrier_id")]
    public string CarrierId { get; set; }

    [JsonProperty("sms_address")]
    public string SmsAddress { get; set; }

    [JsonProperty("mms_address")]
    public string MmsAddress { get; set; }
}

도움이 되었기를 바랍니다!

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Gson 및 Retrofit 2를 사용하여 복잡한 API 응답 역 직렬화

분류에서Dev

REST API의 HTTP 메서드에 대한 요청 및 응답에서 Json 직렬화 또는 역 직렬화를 적용하는 방법

분류에서Dev

C # Newtonsoft.json을 사용하여 단 하나의 속성 (루트를 찾을 수 없음)에 대한 Json 응답을 역 직렬화합니다.

분류에서Dev

NHibernate 응답을 통한 웹 API 사용자 정의 직렬화

분류에서Dev

Zoho Docs API 응답을 역 직렬화 할 수 없습니다.

분류에서Dev

Facebook Workplace SCIM Rest API 응답 역 직렬화

분류에서Dev

servicestack MsgPack 클라이언트를 사용할 때 서비스 응답을 역 직렬화 할 수 없습니다.

분류에서Dev

@JsonProperty를 사용하여 JSON 응답을 역 직렬화하는 방법은 무엇입니까?

분류에서Dev

C # 개체 오류에 대한 JSON 응답 역 직렬화

분류에서Dev

Newtonsoft.Json을 사용한 열거 형 역 직렬화

분류에서Dev

newtonsoft JSON deseralizer를 사용하여 Geopoint를 어떻게 역 직렬화합니까?

분류에서Dev

SimpleXML을 사용하여 SOAP 응답을 역 직렬화 할 수 없습니까?

분류에서Dev

SwiftyJSON을 사용하여 역 직렬화 할 변수로 JSON 응답 저장

분류에서Dev

DataContractSerializer를 사용하여 역 직렬화

분류에서Dev

C #에서 Newtonsoft를 사용하여 중첩 된 JSON 개체의 역 직렬화

분류에서Dev

C #에서 Newtonsoft를 사용하여 역 직렬화하는 방법

분류에서Dev

Newtonsoft.Json "추가"를 사용하여 컬렉션 역 직렬화

분류에서Dev

Firestore DB를 사용한 Flutter 데이터 직렬화 및 역 직렬화

분류에서Dev

Azure JSON 응답 역 직렬화 C #

분류에서Dev

OData 중첩 응답 역 직렬화

분류에서Dev

동적 JSON 응답 역 직렬화

분류에서Dev

echonest JSON 응답 역 직렬화

분류에서Dev

Json 응답 C # 역 직렬화

분류에서Dev

Java의 사용자 지정 열거 형 값에 대한 JSON 응답 역 직렬화

분류에서Dev

강력한 형식의 개체로 JSON 응답을 직접 역 직렬화 할 때 필드를 피하는 방법은 무엇입니까?

분류에서Dev

clrmq를 통한 직렬화 및 역 직렬화

분류에서Dev

LocalDateTime-LocalDateTime.parse를 사용한 역 직렬화

분류에서Dev

dart를 사용한 객체 역 / 직렬화

분류에서Dev

Avro를 사용한 중첩 된 특정 유형 역 직렬화

Related 관련 기사

  1. 1

    Gson 및 Retrofit 2를 사용하여 복잡한 API 응답 역 직렬화

  2. 2

    REST API의 HTTP 메서드에 대한 요청 및 응답에서 Json 직렬화 또는 역 직렬화를 적용하는 방법

  3. 3

    C # Newtonsoft.json을 사용하여 단 하나의 속성 (루트를 찾을 수 없음)에 대한 Json 응답을 역 직렬화합니다.

  4. 4

    NHibernate 응답을 통한 웹 API 사용자 정의 직렬화

  5. 5

    Zoho Docs API 응답을 역 직렬화 할 수 없습니다.

  6. 6

    Facebook Workplace SCIM Rest API 응답 역 직렬화

  7. 7

    servicestack MsgPack 클라이언트를 사용할 때 서비스 응답을 역 직렬화 할 수 없습니다.

  8. 8

    @JsonProperty를 사용하여 JSON 응답을 역 직렬화하는 방법은 무엇입니까?

  9. 9

    C # 개체 오류에 대한 JSON 응답 역 직렬화

  10. 10

    Newtonsoft.Json을 사용한 열거 형 역 직렬화

  11. 11

    newtonsoft JSON deseralizer를 사용하여 Geopoint를 어떻게 역 직렬화합니까?

  12. 12

    SimpleXML을 사용하여 SOAP 응답을 역 직렬화 할 수 없습니까?

  13. 13

    SwiftyJSON을 사용하여 역 직렬화 할 변수로 JSON 응답 저장

  14. 14

    DataContractSerializer를 사용하여 역 직렬화

  15. 15

    C #에서 Newtonsoft를 사용하여 중첩 된 JSON 개체의 역 직렬화

  16. 16

    C #에서 Newtonsoft를 사용하여 역 직렬화하는 방법

  17. 17

    Newtonsoft.Json "추가"를 사용하여 컬렉션 역 직렬화

  18. 18

    Firestore DB를 사용한 Flutter 데이터 직렬화 및 역 직렬화

  19. 19

    Azure JSON 응답 역 직렬화 C #

  20. 20

    OData 중첩 응답 역 직렬화

  21. 21

    동적 JSON 응답 역 직렬화

  22. 22

    echonest JSON 응답 역 직렬화

  23. 23

    Json 응답 C # 역 직렬화

  24. 24

    Java의 사용자 지정 열거 형 값에 대한 JSON 응답 역 직렬화

  25. 25

    강력한 형식의 개체로 JSON 응답을 직접 역 직렬화 할 때 필드를 피하는 방법은 무엇입니까?

  26. 26

    clrmq를 통한 직렬화 및 역 직렬화

  27. 27

    LocalDateTime-LocalDateTime.parse를 사용한 역 직렬화

  28. 28

    dart를 사용한 객체 역 / 직렬화

  29. 29

    Avro를 사용한 중첩 된 특정 유형 역 직렬화

뜨겁다태그

보관