Джексон разбор JSON, содержащий массив объектов и массив карт с динамическими клавишами

У меня такой Json:

{ "users":{ "1234":{ "firstname":"Joe", "lastname":"Smith" }, "9876":{ "firstname":"Bob", "lastname":"Anderson" } }, "jobs":[ { "id":"abc", "location":"store" }, { "id":"def", "location":"factory" } ] } 

Я разбираю это с помощью Jackson, поэтому я анализировал ответы, используя: readvalue (json, MyCustomClass.class)

Где выглядит MyCustomClass

 public class MyCustomClass{ @JsonProperty("jobs") ArrayList<Job> jobs; @JsonProperty("users") ArrayList<UserMap> usersMap; } 

Теперь задания отлично разбираются в объектах Джобса, но я не могу заставить пользователей разбираться, так как они имеют динамические клавиши. Я прочитал о JsonAnyGetter / Setter и попытался создать карту объектов UserMap, которая отображает строку -> Пользователь вроде:

 public class UserMap { private HashMap<String,User> usersMap; @JsonAnySetter public void add(String key, User user){ usersMap.put(key, user); } @JsonAnyGetter public Map<String, User> getUsersMap(){ return usersMap; } } 

Но это не работает. Я думаю, что могу сделать это с помощью оболочки TypeReference, но я могу только подумать о том, как это сделать, если бы эти карты были единственным типом, который я возвращал. Так как я получаю разные типы назад (пользователи и задания), можно ли это сделать?

Решение:

 public class MyCustomClass { @JsonProperty("users") public LinkedHashMap<String, User> users; @JsonProperty("jobs") public ArrayList<Job> jobs; } 

Вы могли бы обойти это, написав свой собственный десериализатор и зарегистрировав его с помощью используемого вами объекта mapper. Это должно работать, поскольку вы будете иметь полный контроль над тем, как каждый объект десериализован в объект User.

См. Документацию Джексона о том, как свернуть собственный десериализатор.

Хотелось бы также сказать, что если у вас есть контроль над структурой json – я бы изменил значение ключа (которое я угадываю – это идентификатор для пользователя), чтобы быть частью фактического json-объекта, а не ключевым. Это поможет вам избежать проблемы вместе.

Например:

 "users":{ { "id":"1234", "firstname":"Joe", "lastname":"Smith" }, { "id":"9876", "firstname":"Bob", "lastname":"Anderson" } 
Intereting Posts
Как правильно отображать арабские буквы в андроиде с помощью phonegap? Как создать виджет на главном экране Android? Использование renderscript для обработки и mediacodec для кодирования Обновление TextView с использованием Timer и ArrayList Создание динамического объявления Admob Express Преобразование base64 imageString в растровое изображение для отображения в ImageView, отображающем нуль в растровом изображении Как я могу найти, почему рынок Android фильтрует мое приложение на определенном телефоне Установить значок приложения вправо в панели инструментов деятельности BluetoothAdapter.getDefaultAdapter () бросает RuntimeException, а не в действие Использование библиотеки поддержки разработки в Eclipse Android – Изменить тему приложения onClick Instant Run не работает с proguard Rapid App Prototyping Tools для Android и iOS Автономный режим приложения Android, локальная синхронизация базы данных sqlite с удаленной базой данных Ошибка входа в Android для Facebook