2013-08-08 4 views
3

했다 : 나는 PageResponse에 오류가BEGIN_OBJECT를 예상하지만 이건 내 JSON 데이터입니다 BEGIN_ARRAY

Gson gson = new Gson(); 
JSONArray pageJson = JsonReader.readJsonArrayFromUrl(
    "https://api.4chan.org/b/threads.json"); 
System.out.println(pageJson.toString()); 

PageResponse PageResponse = gson.fromJson(pageJson.toString(), PageResponse.class); 

:

[ 
     { 
     "page": 0, 
     "threads": [ 
      { 
       "no": 498507562, 
       "last_modified": 1375984181 
      }, 
      { 
       "no": 498503346, 
       "last_modified": 1375984243 
      }, 
      { 
       "no": 498497523, 
       "last_modified": 1375984241 
      }, 
      { 
       "no": 498496579, 
       "last_modified": 1375984241 
      }, 
      { 
       "no": 498499114, 
       "last_modified": 1375984240 
      }, 
      { 
       "no": 498503169, 
       "last_modified": 1375984239 
      }, 
      { 
       "no": 498497038, 
       "last_modified": 1375984239 
      }, 
      { 
       "no": 498501946, 
       "last_modified": 1375984238 
      }, 
      { 
       "no": 498507181, 
       "last_modified": 1375984237 
      }, 
      { 
       "no": 498505625, 
       "last_modified": 1375984236 
      }, 
      { 
       "no": 498505578, 
       "last_modified": 1375984242 
      }, 
      { 
       "no": 498507346, 
       "last_modified": 1375984236 
      }, 
      { 
       "no": 498497504, 
       "last_modified": 1375984236 
      }, 
      { 
       "no": 498486742, 
       "last_modified": 1375984234 
      }, 
      { 
       "no": 498502590, 
       "last_modified": 1375984232 
      } 
     ] 
    }, 
    { 
     "page": 1, 
     "threads": [ 
      {(...so on) 

이 내 코드는 직렬화입니다. 다음은 내 PageResponce 클래스입니다. 나는 내가 정보 권리를 다루고 있을지도 모른다고 생각한다. 나는 JsonObjects에서만 일했습니다. 은 "스레드"

public class PageResponse { 

List<Page> pages; 

public List<Page> getPages() { 
    return pages; 
} 

}

마이 페이지 클래스

공용 클래스 페이지 {

int page; 

public int getPage() { 
    return page; 
} 
을 얻는 방법을 다음 0을, 그리고 : 나는 "페이지"를 얻는 방법을 알고 싶습니다

}

답변

4

사용 JSONArray#getJSONObject() 배열 전나무 밖으로 Page 객체를 당겨 티.

Page page = gson.fromJson(pageJson.getJSONObject(0).toString(), Page.class); 
System.out.println(page.getPage()); // 0 

는 모든 페이지가 PageResponse 객체를 둘러싸에 일치하도록 JSON 문자열 {}의 추가 세트를 추가, 또는
Page[] pages = gson.fromJson(pageJson.toString(), Page[].class); 
System.out.println("Total: " + pages.length); // 2 
System.out.println("pages[0] = " + pages[0].getPage()); // pages[0] = 0 

을 사용하여 직렬화합니다. 이제 List<Page>은 위의 역 직렬화 된 개체 인 Page[]과 일치합니다. 당신은뿐만 아니라

class Page { 
    private int page; 
    private List<Threads> threads; 

    public int getPage() { 
     return page; 
    } 

    public List<Threads> getThreads() { 
     return threads; 
    } 
} 

class Threads { 
    private long no; 
    private String last_modified; 

    public long getNo() { 
     return no; 
    } 

    public String getLastModified() { 
     return last_modified; 
    } 
} 

ThreadsPage 클래스를 확장 할 경우

PageResponse pageResp = gson.fromJson("{ pages : " + pageJson.toString() + " }", 
                   PageResponse.class); 
System.out.println(pageResp.getPages().get(1).getPage()); // 1 

이제 전체 JSON 성공적으로 직렬화 것이다.

System.out.println(pageResp.getPages().get(0).getThreads().size()); // 15 

System.out.println(pageResp.getPages().get(0) 
          .getThreads().get(0).getNo()); // 498507562 
System.out.println(pageResp.getPages().get(0) 
          .getThreads().get(0).getLastModified()); // 1375984181 
+1

getJSONObject (0)는 getPage() 호출에 대해 0을 부여하는 첫 번째 페이지 객체를 제공합니다. –

+0

나는 그것을 알아 냈다! 정말 감사합니다. –

+1

@EmmanuelCortes 수락을 보내 주셔서 감사합니다. 그러나'PageResponse []'를 잘못 사용했다. 나는 모든 케이스 (중첩 된 쓰레드 포함)를 테스트하고 다루었습니다. 당신이 원한다면보세요. –

관련 문제