Разбор Джексона JSON, содержащий массив объектов и массив карт с динамическими ключами
У меня есть JSON, как это:
{
"users":{
"1234":{
"firstname":"Joe",
"lastname":"Smith"
},
"9876":{
"firstname":"Bob",
"lastname":"Anderson"
}
},
"jobs":[
{
"id":"abc",
"location":"store"
},
{
"id":"def",
"location":"factory"
}
]
}
Я анализирую это, используя Джексона, и поэтому я анализирую ответы, используя: readvalue(json, MyCustomClass.class)
Где выглядит MyCustomClass
public class MyCustomClass{
@JsonProperty("jobs")
ArrayList<Job> jobs;
@JsonProperty("users")
ArrayList<UserMap> usersMap;
}
Теперь задания отлично разбираются на объекты Jobs, но я не могу заставить пользователей анализировать, так как у них есть динамические ключи. Я прочитал о 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, но я могу только придумать способ сделать это, если бы эти карты были единственным типом, который я получал обратно. Так как я получаю разные типы (пользователи и рабочие места), возможно ли это сделать?
2 ответа
Решение:
public class MyCustomClass {
@JsonProperty("users")
public LinkedHashMap<String, User> users;
@JsonProperty("jobs")
public ArrayList<Job> jobs;
}
Вероятно, вы могли бы обойти это, написав свой собственный десериализатор и зарегистрировать его в используемом вами объектном преобразователе. Это должно работать, поскольку у вас будет полный контроль над тем, как каждый объект десериализуется в объект User.
См. Эту документацию Джексона о том, как свернуть свой собственный десериализатор
Также хотелось бы сказать, что если у вас есть контроль над структурой json, я бы изменил значение ключа (которое, я полагаю, является идентификатором пользователя), чтобы оно было частью реального объекта json, а не ключом. Это поможет вам избежать проблемы все вместе.
Например:
"users":{
{
"id":"1234",
"firstname":"Joe",
"lastname":"Smith"
},
{
"id":"9876",
"firstname":"Bob",
"lastname":"Anderson"
}