Джексон начал десериализацию на два уровня ниже - PullRequest
2 голосов
/ 04 апреля 2019

У меня есть неуклюжий файл json, подобный этому:

{
"clientByClientId" : {
  "123" : {
    "clientId" : "123"
     "moreFields" : "moreData"
   }
  "456" : {
    "clientId" : "456"
     "moreFields" : "moreData"
   }
 }
}

Как видите, два верхних уровня этого json излишни.Каков наилучший способ десериализации этого в коллекцию Client объектов?Я пытался использовать онлайн json для работы с инструментами pojo, но в итоге они создали классы с именами «123» и «456».В идеале я хотел бы использовать Джексона, но я открыт для других решений.

Ответы [ 2 ]

3 голосов
/ 04 апреля 2019

Небольшое примечание: ваш JSON искажен, так как в нем отсутствуют несколько запятых. Как только они будут добавлены, это будет работать для вас.

Прежде всего, вам понадобится класс для представления Client:

public class Client {
    private final int clientId;
    private final String moreFields;

    @JsonCreator
    public Client(@JsonProperty("clientId") int clientId, 
                  @JsonProperty("moreFields") String moreFields) {
        this.clientId = clientId;
        this.moreFields = moreFields;
    }

    @Override
    public String toString() {
        return "Client[clientId=" + clientId + ", moreFields=" + moreFields + "]";
    }
}

Теперь вам просто нужно создать ObjectMapper и перебрать элементы вашей clientByClientId карты, что можно сделать с помощью следующего:

ObjectMapper objectMapper = new ObjectMapper();
JsonNode node = objectMapper.readTree(json).get("clientByClientId");
Map<Integer, Client> clientMap = objectMapper.readValue(node.traverse(),
        new TypeReference<Map<Integer, Client>>() {});
System.out.println(clientMap.values());

Вывод этого кода:

[Client[clientId=123, moreFields=moreData], Client[clientId=456, moreFields=moreData]]
0 голосов
/ 04 апреля 2019

Я думаю, что-то вроде этого должно работать:

   public class Body {
    public ClientByClientId clientByClientId;
}

public class ClientByClientId {
    public Map<String, Client> clientMap;
}

public class Client {
    int clientId;
    String moreFields;
}

Это должно поставить ваши идентификаторы верхнего уровня в качестве ключа на карте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...