2014-02-17 1 views
2

저는 JSON.NET을 처음 사용하고 있으며 최근에 출시 된 새로운 Marvel API를 사용해 왔습니다. JSON.NET 중첩 된 데이터 유형 해결

나는 그것이 다음 JSON 데이터 구조를 반환이 API를 호출

: -이 같은이 데이터에 대한 클래스를 생성 할 수 있습니다

{ 
    "code": 200, 
    "status": "Ok", 
    "etag": "f0fbae65eb2f8f28bdeea0a29be8749a4e67acb3", 
    "data": 
    {  
     "offset": 0,  
     "limit": 20,  
     "total": 30920,  
     "count": 20,  
     "results": [{array of objects}}] 
    } 
} 

:

public class Rootobject 
{ 
    public int code { get; set; } 
    public string status { get; set; } 
    public string etag { get; set; } 
    public Data data { get; set; } 
} 

public class Data 
{ 
    public int offset { get; set; } 
    public int limit { get; set; } 
    public int total { get; set; } 
    public int count { get; set; } 
    public Result[] results { get; set; } 
} 

public class Result 
{ 

} 

이제 내 문제. API에서 돌아온 결과는 다른 객체와 관련 될 수 있습니다. Characters, Comics, Series 등과 관련된 결과 일 수 있습니다. 객체는 모두 다른 속성을 포함합니다.

결과가 관련된 엔터티 유형을 기반으로 결과 클래스 속성을 스왑 할 수 있어야합니까?

실제로 처리 할 수 ​​있습니까?

+1

제네릭을 사용해 보셨습니까? 그게 효과가 있다고 생각합니다. 'RootObject '는'Data data'를 가지고 있으며 그 중 하나는'T [] results'를 가지고 있습니다. – Stijn

+0

나는 감사한다, 나는 그 감사를 볼 것이다! – Derek

+0

@ Stijn 제네릭의 문제점은 결과 배열이 객체가 될 수 있고 와이어를 통해 무엇이 들어오는 지 알 수 없다는 것입니다. 이것이 직렬화 특정 문제라면 동의 하겠지만 그가 비 직렬화하려는 것 같습니다. – Gent

답변

1

을 사용하면 개체에서 사용할 수있는 속성으로 어떤 개체 유형인지 검색 할 수 있습니다.

jObj["someComicSpecificProperty"] != null 

그러나 이것은 완전한 증거가 아니며 결과 배열에 대해 개체 단위로 수행해야합니다.

사람들이 사용하는 다른 방법은 "typeName"인 개체의 속성을 사용하는 것입니다.

그러나이 문제의 근본 원인은 강력하게 형식화되지 않은 속성을 강력하게 입력하려고하기 때문입니다. 이러한 여러 유형의 결과를 다른 속성으로 분리하여이 문제가 발생하지 않도록하는 것이 좋습니다.

+0

그래, 나는 이것에 익숙하지 않은 것 같아, 나는 단지 객체 유형마다 다른 구조를 설정해야한다고 생각한다. – Derek

+1

@Derek 그래, 내가 정말로 투쟁하는 것은 지나치게 DRY (Do not Repeat Yourself) 코드를 쓰는 것이다. 때로는 DRY를하는 것이 코드를 덜 결정적이고 어렵게 만드는 길로 인도 할 수 있습니다. 나는 당신이하고있는 일과 당신의 기대가 어떤 부르심에서 왔는지를 분명하게 나타내는 분리 된 구조를 제안 할 것입니다. – Gent

+0

할 것입니다. 오늘 밤 집에 돌아와서 건축 할 때 솔루션을 게시 할 것입니다. 나는 thik work가 Marvel ;-)에서 일하기를 원한다. – Derek

1

약속대로이 문제에 대한 anser를 게시했습니다. JSON 응답에는 관계형 데이터베이스와 매우 유사한 모든 관련 데이터 유형을 포괄하는 중첩 데이터가 있음이 밝혀졌습니다.

정말 멋진 것을 찾았습니다. 기본적으로 API에 요청하여 문자열에 대한 응답을 변환했습니다. 그런 다음 디버거를 사용하여 내용의 복사본을 클립 보드에 가져 왔습니다.

새로운 클래스를 만들고 MarvelResponse라고했습니다.

파일에 NewtonSoft.Json 지시문을 추가하고 VS2012의 편집 메뉴에서 선택하여 붙여 넣기 옵션을 사용했습니다. 여기서 "JSON 클래스로 붙여 넣기"옵션을 붙여 넣을 수 있습니다. 여기에 약간의 조정 후

는 제공하는 것입니다 : -

namespace Kaiser.Training.Data.JSONClasses 
{ 

    public class MarvelResponse 
    { 
     public int code { get; set; } 
     public string status { get; set; } 
     public string etag { get; set; } 
     public Data data { get; set; } 
    } 

    public class Data 
    { 
     public int offset { get; set; } 
     public int limit { get; set; } 
     public int total { get; set; } 
     public int count { get; set; } 
     public Result[] results { get; set; } 
    } 

    public class Result 
    { 
     public int id { get; set; } 
     public string name { get; set; } 
     public string description { get; set; } 
     public DateTime modified { get; set; } 
     public Thumbnail thumbnail { get; set; } 
     public string resourceURI { get; set; } 
     public Comics comics { get; set; } 
     public Series series { get; set; } 
     public Stories stories { get; set; } 
     public Events events { get; set; } 
     public Url[] urls { get; set; } 
    } 

    public class Thumbnail 
    { 
     public string path { get; set; } 
     public string extension { get; set; } 
    } 

    public class Comics 
    { 
     public int available { get; set; } 
     public string collectionURI { get; set; } 
     public ComicResourceUriItem[] items { get; set; } 
     public int returned { get; set; } 
    } 

    public class ComicResourceUriItem 
    { 
     public string resourceURI { get; set; } 
     public string name { get; set; } 
    } 

    public class Series 
    { 
     public int available { get; set; } 
     public string collectionURI { get; set; } 
     public SeriesResourceItem[] items { get; set; } 
     public int returned { get; set; } 
    } 

    public class SeriesResourceItem 
    { 
     public string resourceURI { get; set; } 
     public string name { get; set; } 
    } 

    public class Stories 
    { 
     public int available { get; set; } 
     public string collectionURI { get; set; } 
     public StoriesResourceItem[] items { get; set; } 
     public int returned { get; set; } 
    } 

    public class StoriesResourceItem 
    { 
     public string resourceURI { get; set; } 
     public string name { get; set; } 
     public string type { get; set; } 
    } 

    public class Events 
    { 
     public int available { get; set; } 
     public string collectionURI { get; set; } 
     public EventsResourceUriItem[] items { get; set; } 
     public int returned { get; set; } 
    } 

    public class EventsResourceUriItem 
    { 
     public string resourceURI { get; set; } 
     public string name { get; set; } 
    } 

    public class Url 
    { 
     public string type { get; set; } 
     public string url { get; set; } 
    } 

} 

이것은 큰 도움이되었다! 다른 사람이 유용하다고 생각하기를 바랍니다.

+0

헤이, 왜 내 대답을받는 대신에 대답을 올리는지 궁금하다. 내가 덧붙여서는 안되는 것이 있습니까? – Gent