Как я использую API Google Gson для десериализации JSON правильно?

Короче говоря, это - эскиз объекта 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

22
задан FK82 19 May 2010 в 11:58
поделиться

2 ответа

Это невозможно. Вам нужно изменить структуру 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, поскольку оно недействительно.

38
ответ дан 29 November 2019 в 04:54
поделиться

Я думаю, что BalusC дал хорошие указания по конкретному вопросу относительно Gson (и в целом, привязка данных один к одному); но на всякий случай, если вы считаете, что должна быть более динамическая обработка, вы также можете рассмотреть другие пакеты обработки JSON. Многие пакеты имеют дополнительные или альтернативные способы сопоставления: Json-lib, flexjson и Jackson, по крайней мере, имеют дополнения по сравнению с Gson. Некоторые предлагают более свободное сопоставление (вы определяете имена вещей для типов), другие — фактическую поддержку полиморфных типов (объявление объекта, но фактически может сопоставляться с подтипом, который был сериализован).

0
ответ дан 29 November 2019 в 04:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: