2013-05-29 5 views
3

У меня есть JSON, который содержит общие значения. Я попробовал это, используя Карты, но не смог получить результаты. Моя проблема заключается в том, что общие теги начинаются со второго уровня. Вот JSON, я пытаюсь разобраться с gson.Разбор общей метки в JSON от GSON

{ 
"success": true, 
"status": 200, 
"events": { 
    "Sep 2013": [ 
     { 
      "artist_id": 1, 
      "created_at": "2013-05-18T15:21:00Z", 
      "duration": 2, 
      "end_time": "2013-09-19T22:00:00Z", 
      "event_desc": "", 
      "event_facebook_link": "", 
      "event_link": "https://www.smtickets.com/marketing/view/1316", 
      "feature_small": false, 
      "featured_status": false, 
      "id": 90, 

В этом теге JSON после «событий» является общим, т. Е. «Сентябрь 2013».

Я пытаюсь прямо сейчас:

public Event event ; 

public class Event { 

    public ArrayList<Map<String, String>> dates;  

} 

И я к нему доступ:

obj = gson.fromJson(reader, AllShowsActivityData.class); 

Может кто-нибудь сказать мне, что, как я могу сделать класс дат. Так что Gson может сериализовать его. Или есть другой способ итерации первого уровня тега, а затем я могу объявить что-то вроде этого

Type fooType = new TypeToken<Foo<Bar>>() {}.getType(); 

gson.toJson (Foo, fooType);

+0

Насколько я знаю, с общими филинами вы ввернуты и больше не можете сопоставить JSON с каким-либо объектом. Вам придется разобрать JSON самостоятельно с помощью gson, sax-style. –

+0

Серьезно: (... должен быть какой-то способ сделать это. Фактически, согласно https://sites.google.com/site/gson/gson-user-guide#TOC-Serializing-and-Deserializing-Generic -Типы мы можем сделать это, но это для тегов первого уровня. – Hasandroid

ответ

3

Вы действительно можете использовать Map, но вы не используете его правильно. Обратите внимание, что у вас есть поле "events", который является объектом, который содержит ряд пара string и array объектов:

{ "events": { "Sep 2013": [ {}, {}, ... ], ... } } 

Чтобы разобрать ваш JSON вам нужна структура классов, как это (в псевдо -кода):

class AllShowsActivityData 
    Map<String, List<Event>> events 

class Event 
    int artist_id 
    String created_at //parsing as String to simplify... 
    int duration 
    ... 

И тогда ваш код для разбора:

AllShowsActivityData obj = gson.fromJson(reader, AllShowsActivityData.class); 

И, наконец, если то, что вы хотите получить доступ к даты, вы будете иметь все из них:

Set<String> dates = obj.getEvents().keySet(); //"Sep 2013", ... 

Примечание: на самом деле, если вы хотите только те даты, вы даже не нужен класс Event, и вы можете использовать только Map<String, List<Object>> events ...

+0

Спасибо большое, он работал отлично. – Hasandroid

+0

Можете ли вы сказать мне, как я могу получить другие значения, такие как artist_id ... – Hasandroid

+1

@Hasandroid, просто добавьте больше атрибутов к классу «Событие» с именами, соответствующими именам полей в ответе JSON, т. е. 'String end_time',' String event_desc' и т. д. ... (вам проще использовать только 'String',' int' и ' boolean'). Просто получите объект события с событием Event event = obj.getEvents(). get (i); ', а затем вы можете получить доступ ко всем полям в' event' ... – MikO

Смежные вопросы