2017-01-28 5 views
1

пытаюсь разобрать мои данные JSON, которые выглядят как данные ниже. Я успешно занимаюсь некоторыми полями, но пытаюсь получить «имя» под «0» под «категорией» в разделе «условия».Как сортировать объекты Nested JSON с помощью библиотеки Gson?

[ 
    { 
    "ID": 1710, 
    "status": "publish", 
    "type": "post", 
    "content": "Lorem ipsum", 
    "parent": null, 
    "format": "standard", 
    "modified_tz": "UTC" 
    }, 
    "featured_image": { 
    "ID": 1713, 
    "title": "km", 
    "status": "inherit", 
    "type": "attachment", 
    } 
    } 
    } 
    } 
    }, 
    "terms": { 
    "category": [ <<<<---AM REFERENCING HERE--->>>>> 
    { 
    "ID": 2, 
    "name": "Entertainment", 
    "slug": "entertainment", 
    "taxonomy": "category", 
    "parent": null, 
    "count": 30, 
    } 
    ] 

    } 
    } 
    ] 

Это, как я разобраны данные:

List<Object> list = (List) new Gson.fromJson(response, List.class); 
List<String, Object> mapPost = list.get(index); 
List<String, Object> terms = (Map<String, Object>) mapPost.get("terms"); 
List<String, Object> category= (Map<String, Object>) terms.get("category"); 
List<String, Object> zero= (Map<String, Object>) category.get("0"); 
String tag = (String) zero.get("name"); 

Просьбы помочь мне, что я делаю неправильно?

+0

это должно быть 'category.get (0)'. '0' - это индекс для массива, а не ключ для json – akash93

+0

Вот сообщение об ошибке, которое я получил: –

+0

'E/AndroidRuntime: FATAL EXCEPTION: main Процесс: example.example.com, PID: 13804 java.lang. ClassCastException: java.util.ArrayList нельзя передать в java.util.Map ' –

ответ

0

Код, который вы, может даже не компилировать (разбитой Gson вызова конструктора , Java не предоставляет List<K,V> ...). Списки также не могут быть отображены в карты во время выполнения. JSON сломана, как хорошо, но, если вы ввели код, я думаю, что вы хотели разбора name находится в $[(index)].terms.category[0].name:

final String name = gson.fromJson(response, JsonElement.class).getAsJsonArray() 
      .get(index).getAsJsonObject() 
      .get("terms").getAsJsonObject() 
      .get("category").getAsJsonArray() 
      .get(0).getAsJsonObject() 
      .get("name").getAsJsonPrimitive() 
      .getAsString(); 
    System.out.println(name); 

Вам не нужно десериализовать каждый вложенный объект, который вы собираетесь для перехода (и это более эффективно с точки зрения производительности): просто пересечь дерево JSON.

+0

Спасибо !, Это сработало! –

+0

Поскольку он не уверен, что пользователь будет включать тег (то есть «окончательное строковое имя»), я окружил код выше, в блоке try catch, это нормально? –

+0

Всё зависит. Вы можете разбить цепочку и проанализировать ее фрагменты. –

0

я нашел решение:

Поскольку «категории» тег содержит массив JSON объект (в данном случае один объект).

я бросил «категорию» в ArrayList

Map<String, Object> terms = (Map<String, Object>) mapPost.get("terms"); 
ArrayList category = new ArrayList(); 
category = ((ArrayList) terms.get("category")); //<--Cast to ArrayList 
zero = (Map<String, Object>) category.get(0); 

Тогда я получил «название» тега, выполнив:

String tag = (String) zero.get("name")