2011-11-01 2 views
2

필드가 동적 인 일정 목록에서 이벤트에 대한 JSON 응답을 구문 분석해야합니다. 이 필드는 이벤트가 발생하는 달에 따라 변경됩니다.Android : GSON을 사용하여 동적 필드로 응답 구문 분석

이전에는 GSON으로 데이터를 파싱했지만 이제는 정적 필드가있어서 필요한 POJO를 쉽게 만들 수 있습니다. 하지만 역동적 인 분야에서는 어떻게해야할까요?

내가 분석 할 필요가있는 응답과 같이이다 :

{ 
    "Agenda/Future": { 
    "November 2011/0": [ 
     { 
     "id": "5675", 
     "eventid": "", 
     "name": "testing testing 123", 
     "startdate": "nov 25", 
     "datecompute": "2011-11-25T08:00:00", 
     "group_month": "November 2011", 
     "flg_Data": "Database" 
     } 
    ], 
    "February 2012/1": [ 
     { 
     "id": "5681", 
     "eventid": "", 
     "name": "dfd", 
     "startdate": "feb 3", 
     "datecompute": "2012-02-03T12:00:00", 
     "group_month": "February 2012", 
     "flg_Data": "Database" 
     }, 
     { 
     "id": "5679", 
     "eventid": "", 
     "name": "vfvd", 
     "startdate": "feb 17", 
     "datecompute": "2012-02-17T12:00:00", 
     "group_month": "February 2012", 
     "flg_Data": "Database" 
     } 
    ], 
    "February 2013/2": [ 
     { 
     "id": "5680", 
     "eventid": "", 
     "name": "df", 
     "startdate": "feb 14", 
     "datecompute": "2013-02-14T12:00:00", 
     "group_month": "February 2013", 
     "flg_Data": "Database" 
     } 
    ], 
    "September 2013/3": [ 
     { 
     "id": "5677", 
     "eventid": "", 
     "name": "fsdfsd", 
     "startdate": "sep 14", 
     "datecompute": "2013-09-14T12:00:00", 
     "group_month": "September 2013", 
     "flg_Data": "Database" 
     } 
    ], 
    "November 2015/4": [ 
     { 
     "id": "5676", 
     "eventid": "", 
     "name": "fsdfsd", 
     "startdate": "nov 13", 
     "datecompute": "2015-11-13T12:00:00", 
     "group_month": "November 2015", 
     "flg_Data": "Database" 
     } 
    ] 
    } 
} 

당신이 볼 수 있듯이, 달에 대한 개체의 제목은 동적입니다. 제목의 끝 부분에있는 값과 제목 자체는 달 배열에서 실제 달과 위치를 기반으로 변경됩니다.

내가 여기에서 다른 질문을 본 것에서부터 Maps으로 작업해야합니다. 하지만 어떻게 그렇게 할 것인지 잘 모르겠습니다. 달 배열에 포함 된 개별 이벤트에 대해 Event라는 POJO를 만들면 어떻게 초기화 될까요?

안부


나는 기본 Map와 잭슨을 사용하여 아미르의 제안을 시도했습니다. 슬프게도 1 크기의 Map이 생성됩니다. 전체 JSON 응답은 단일 객체로 파싱됩니다. 물론 개인 이벤트에서 데이터를 가져와야하기 때문에 이것이 내가 원하는 것이 아닙니다.

누구에게 어떻게 할 수 있을지 제안이 있습니까? 일반적으로 이러한 것들을 아주 빨리 파악할 수는 있지만 동적 객체 명명으로 인해이 문제를 해결할 수는 없습니다.


결국이 문제를 해결할 수있었습니다. 결국 일반 JSONObjects를 사용하여 작업을 마쳤습니다. 다음과 같이

나는 그것이 작동하도록하는 데 사용되는 코드는 다음과 같습니다 당신이 볼 수 있듯이

 JSONObject jsonObject = new JSONObject(response); 
     JSONObject agenda = jsonObject.getJSONObject("Agenda/Future"); 

     if (agenda != null) { 
      System.out.println(agenda.length()); 
      JSONArray events = agenda.names(); 
      if (events.length() > 0) { 
       System.out.println("At least its bigger then 0. It's: " 
         + events.length()); 
       for (int i = 0; i < events.length(); i++) { 
        System.out.println(events.get(i).toString()); 
        JSONArray test = agenda.getJSONArray(events.get(i) 
          .toString()); 
        if (test != null) { 
         JSONObject testt = test.getJSONObject(0); 
         if (testt != null) { 
          System.out.println(testt.getString("name")); 
         } else { 
          System.out.println("Still empty, Check again."); 
         } 
        } 
       } 
      } 

     } else { 
      System.out.println("Agenda is completely empty, try again."); 
     } 

이 여전히 테스트 이름을 포함하지만 적어도 작동합니다. 모두에게 도움을 주셔서 감사합니다.

+0

+1 좋은 질문입니다. – Venky

답변

1

월 데이터가 유효한 Java 식별자가 아니기 때문에 GSON에 custom serialization을 사용해야 할 것입니다.Map 객체를 사용하는 것에 대해 이야기하고 있지만 그렇게 할 예정이라면 기본적으로지도/해시 테이블에 기본적으로 빌드 된 JSONObject와 같은 객체 인 org.json과 같은 객체를 사용할 수 있습니다.

+0

Amir의 aproach가 필요한 것 같아서 처음으로이 대답을 버린 후 정상적으로 JSONObject를 시험해 보았습니다. 내 문제를 해결할 수있었습니다. 정말 고마워요! 수락 됨 –

1

앞에서 말했듯이 모든 필드가 동적 인 경우 pojo에 모든 필드의 수퍼 세트를 만들 수 있습니다. 하지만 그건 도움이되지 않으며 나는 Map이 최선의 해결책이라고 생각합니다. GSON을 사용하면 할 수 있습니다

Type type = new TypeToken<Map<String, String>>(){}.getType(); 
Map<String, String> map = gson.fromJson("{'key1':'123','key2':'456'}", type); 

문자열의지도를 반환합니다.

실제로 GSON을 사용하지 않았습니다. 나는 Jackson LIB 매우 행복하고 그와 함께 당신은

new ObjectMapper().readValue("...json...", Map.class) 

가 위의 당신이 원하는 무엇을하는지도의지도를 반환 할 수 있습니다.

+0

잭슨에게 이것에 대한 소용돌이를 줄 수도 있지만 가능하다면 나는 현재 가장 경험이 많은 GSON을 사용하고 싶습니다. 당신의 빠른 예제가'Map'에서 2 개의'Strings'을 사용하는 경우, 다음과 같은 것을 사용하면 작동 할 것이라고 생각하십니까 : 'Type type = new TypeToken >() {}. getType(); Map map = gson.fromJson (myJsonrResponse, type); ' 원래 게시물에서 말했던 것처럼? –

+0

잭슨과 함께 시도했기 때문에 이것이 효과가 있다는 것을 알고 있습니다. GSON을 사용하면 이벤트 맵이 효과적이라고 생각합니다. 그러나지도의지도 나는 확실하지 않다. –

+0

나는 마침내 문제를 해결할 수 있었지만, mjmarsh는 나에게 일을 끝내는 제안을했다. Jackson을 언급하는 것에 대해 고마움을 많이 띠지 만, 앞으로 유용하게 사용할 수있을 것입니다. –