Короче говоря, это - эскиз объекта JSON, который я хочу проанализировать в JAVA:
{
object1: {
item1: //[String | Array | Object] ,
item2: // ...
//<> more items
object2: { /* .. */ }
//<> more objects
}
Это POJO s, я создал для парсинга (я не учту import
операторы для пользы краткости):
(1) Представление полного объекта JSON
public class JObjectContainer {
private List<JObject> jObjects ;
public JObjectContainer() { }
//get & set methods
}
(2) Представление вложенных объектов:
public class JObject {
private String id ;
private List<JNode> jObjects ;
public JObject() { }
//get & set methods
}
(3) Представление объектов:
public class JNode {
private JsonElement item1 ;
private JsonElement item2 ;
//<> more item fields
public JNode() { }
//get & set methods
}
Теперь, создавая экземпляр Gson (FileReader
для импорта jsonFile
),
Gson gson = new Gson() ;
JObjectContainer joc = gson.fromJson(jsonFile,JObjectContainer.class) ;
Я получаю a NullPointerException
каждый раз, когда я пытаюсь получить доступ к parseable объекту (например, через a ListIterator
). Gson действительно однако создает объект класса, я указал и не бросаю последующих ошибок.
Я знаю, что это было сделано прежде. Так, что я пропускаю?
TIA
Это невозможно. Вам нужно изменить структуру JSON, чтобы представить объект1
, объект2
и т.д. как элементы массива. Сейчас это свойства объекта, которых неизвестно сколько (иначе вы не пытались отобразить его как List
). Gson умный, но не такой умный :)
Итак, в качестве базового примера, эта JSON структура с массивом:
{ nodes:
[
{ item1: 'value1a', item2: 'value2a' },
{ item1: 'value1b', item2: 'value2b' },
{ item1: 'value1c', item2: 'value2c' }
]
}
в сочетании с Java представлением (которое не обязательно называть POJO, а просто javabean или model object или value object)
public class Container {
private List<Node> nodes;
// +getter.
}
public class Node {
private String item1;
private String item2;
// +getters.
}
и этот вызов Gson
Container container = new Gson().fromJson(json, Container.class);
должен работать.
Обновление: чтобы было понятно, проблема в вашей структуре JSON, а не в структуре объекта Java. Если предположить, что ваша структура Java-объектов именно та, которую вы хотели бы получить в итоге, то ваша структура JSON должна выглядеть следующим образом, чтобы заставить Gson сделать свою работу:
{ jObjects:
[
{ id: 123, jObjects:
[
{ item1: 'value1a', item2: 'value2a' },
{ item1: 'value1b', item2: 'value2b' },
{ item1: 'value1c', item2: 'value2c' }
/* etc... commaseparated */
]
},
{ id: 456, jObjects:
[
{ item1: 'value1d', item2: 'value2d' },
{ item1: 'value1e', item2: 'value2e' },
{ item1: 'value1f', item2: 'value2f' }
/* etc... commaseparated */
]
}
/* etc... commaseparated */
]
}
Только свойство JsonElement
должно быть заменено на String
, поскольку оно недействительно.
Я думаю, что BalusC дал хорошие указания по конкретному вопросу относительно Gson (и в целом, привязка данных один к одному); но на всякий случай, если вы считаете, что должна быть более динамическая обработка, вы также можете рассмотреть другие пакеты обработки JSON. Многие пакеты имеют дополнительные или альтернативные способы сопоставления: Json-lib, flexjson и Jackson, по крайней мере, имеют дополнения по сравнению с Gson. Некоторые предлагают более свободное сопоставление (вы определяете имена вещей для типов), другие — фактическую поддержку полиморфных типов (объявление объекта, но фактически может сопоставляться с подтипом, который был сериализован).