2010-11-02 3 views
1

Я пытаюсь разобрать JSON структуру, похожую на эту:Синтаксический JSON в Map <String, Entity> с FlexJSON

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

У меня есть класс CarEntity, определенный с makeName, модель, год атрибуты определены и доступны через сеттеры/геттеры.

Я пытаюсь десериализации 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>>>)

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

ответ

2

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

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

Пройденные «values.values» относится к значению внешних МАП затем обхода следующих значения карты являются экземплярами CarEntity.

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

0

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

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

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

+0

Это на самом деле не помогло. Очевидно, возвращает другую карту, но это все еще карта строк, а не объекты объекта –

1

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

В качестве альтернативы вы можете подклассом HashMap в свой собственный тип (MyEntityMap расширяет HashMap), так как тогда информация типа может быть выведена из универсального супертипа; и передача MyEntityMap.class даст информацию о типе, которую могут использовать большинство библиотек JSON (по крайней мере, Джексон и GSON).

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

 Смежные вопросы

  • Нет связанных вопросов^_^