Вопрос

Я пытаюсь разобрать структуру JSON, подобную этой:

    {
 "cars": {
  "112": {
   "make": "Cadillac",
   "model": "Eldorado",
   "year": "1998"
  },
  "642": {
   "make": "Cadillac",
   "model": "Eldorado",
   "year": "1990"
  },
  "9242": {
   "make": "Cadillac",
   "model": "Eldorado",
   "year": "2001"
  }
 }}

У меня есть класс Carittity, определенный с Makemame, моделью, летными атрибутами, определенными и доступными через Setters / GetTers.

Я пытаюсь определить этот JSON, как это:

    Map<String, CarEntity> deserialized = new JSONDeserializer<Map<String, CarEntity>>()
   .use("cars.values", Map.class)
   .deserialize(json);

и это не работает :( это десериализирует это, но не в Map<String, CarEntity> а скорее в глубокую карту (что-то вроде Map<String, Map<String, Map<String, String>>> )

Что я делаю неправильно?

Это было полезно?

Решение

Ваша проблема в том, что у вас JSON имеет две карты. Тот, который содержит ключ «автомобили» и тот, который содержит фактическую осторожность. К сожалению, вы не можете ссылаться на один ключ на карте и назначить типы только на этой клавише в это время. Как правило, типы настроек на значения для коллекций относятся ко всем значениям в коллекции. Вам не нужно указывать типы для первой карты, которая содержит ключ «Автомобили», поскольку он будет десессифицировать его по умолчанию.

Map<String, CarEntity> deserialized = new JSONDeserializer<Map<String,Map<String, CarEntity>>>()
    .use("values.values", CarEntity.class )
    .deserialize(json).get("cars");

Путь «Значения. Values» относится к значениям внешних карт, затем пересекающие следующие значения карты - все экземпляры охватываний.

Я рассмотрел изменение выражений пути, чтобы быть более выразительным, что позволяет вам нацелиться на одно значение в коллекции, но это увеличивает накладные расходы по оценке их, и оказывается обратной совместимой, является проблемой.

Другие советы

Скорее всего, вы укушены Java Type Setaure: рассматриваемая библиотека JSON не знает, что вы хотите; Все, что он видит, эквивалентен карте. Таким образом, вы должны указать хотя бы тип значения как-то. Надеюсь, документация FlexJSON указывает на то, как.

В качестве альтернативы вы можете подчеркнуть hashmap в свой собственный тип (myentitymap расширяет hashmap), поскольку тогда информация может быть выведена из универсального типа Super; и прохождение MyEntityMap.Class даст информацию о том, что большинство библиотек JSON могут использовать (не менее Jackson и Gson).

Если эти не работают, библиотеки Джексона и GSON могут легко обрабатывать это использование; У обоих есть методы для уточнения универсальных типов для десериализации.

Просто добавь еще один звонок на get("cars") подобно:

Map<String, CarEntity> deserialized = new JSONDeserializer<Map<String, CarEntity>>()
   .use("cars.values", Map.class)
   .deserialize(json).get("cars");

json string был, вероятно, сериал из переменной cars Напечатано как Map<String, CarEntity>

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top