Разбор Джексона 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"
       }     
Другие вопросы по тегам