Разбор JSON на карту с FlexJSON
-
28-09-2019 - |
Вопрос
Я пытаюсь разобрать структуру 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>