2016-09-30 2 views
0

Newtonsoft.Json과 웹 API 통합을하고 있습니다. 언제나 그렇듯이 다시 보내고있는 내용을 제대로 deserialize하기 위해서는 바보 스턴트를해야합니다. 이 경우 대상 객체의 속성과 일치하지 않는 첫 번째 속성을 특정 속성으로 일치 시키십시오.

는 API 구조의이 종류 닮은 응답 보내드립니다 :

{ "contacts": [ ... ], "has-more": true, "offset": 38817 } 

을 특성이 다른 방법 응답에 거의 일정하고 있었다 "오프셋" "-가 더"를 그에 따라 deserialize하는 응답 객체에 정의됩니다. 응답 개체는 다음과 같이 보입니다.

public class APIResponse { 
    public JContainer Result { get; set; } 
    [JsonProperty("has-more")] 
    public bool HasMore { get; set; } 
    [JsonProperty("offset")] 
    public int Offset { get; set; } 
} 

첫 번째 "연락처"속성은 다를 수 있습니다. 일부 방법의 경우 "연락처"를 얻을 수 있고, 일부는 "회사"가 될 수도 있고 다른 사람들은 누가 아는가를 얻을 수도 있습니다. 나는 또한 모든 응답이 그러한 "가변적 인"속성을 가질 것이라는 확신을 줄 수있는 방법이 없으며, 위치 적으로 말하면서 그것이 최초 일 것입니다.

이 예에서 디시리얼라이저는 Json을보고 "연락처, '연락처'에 매핑되는 것이 아무것도 없으므로 '결과'에 넣을 것입니다. , 그리고 나서 JsonProperty 속성에서 'has-more'와 'offset'이 HasMore와 Offset으로 들어간다는 것을 알 수 있습니다. 좋아, 모든 것이 여기에 있습니다. "

여기에는 사용자 정의 JsonConverter 또는 IContractResolver의 트릭이 포함되어 있지만 여기에는 점을 연결하지 않은 것 같습니다. 간단한 사용자 정의 계약 해결자를 시도했지만 JSON 텍스트에서 찾을 객체 속성 이름을 속성 이름으로 확인하는 데 계약 확인자를 사용하는 것으로 나타났습니다. 그 반대의 경우도 마찬가지입니다.

+1

당신은 사용할 수 있어야합니다 ['[JsonExtensionData]'] (http://www.newtonsoft.com/json/help/html/DeserializeExtensionData.htm). – dbc

+0

@dbc 그 일을 끝내는 것처럼 보입니다. 나는 오늘 오후에 그것을 시험해 볼 것이다. – db2

답변

1

각 응답 유형에 대해 기본 클래스 + 유도를 사용할 수 있습니다.

public class APIResponseBase { 
    [JsonProperty("has-more")] 
    public bool HasMore { get; set; } 
    [JsonProperty("offset")] 
    public int Offset { get; set; } 
} 

public class ContactsResponse : APIResponseBase { 
    public IEnumerable<Contact> Contacts { get; set; } 
} 

public class CompaniesResponse : APIResponseBase { 
    public IEnumerable<Company> Companies { get; set; } 
} 

var contactsResponse = JsonConvert.Deserialize<ContactsResponse>(json); 
IEnumerable<Contact> contacts = contactsResponse.Contacts 
+0

괜찮은 생각 같습니다. 실제 API 호출을 만드는 데 사용되는 Execute() 메소드를 역 직렬화 할 응답 서브 클래스 유형을 사용하는 generic으로 변환 할 수 있다고 상상해보십시오. – db2

+0

알았어. ;) generics는 강력합니다. – Jeff