У меня есть JSON файл, который выглядит так:
{
"root": [
{
"id": "abc1",
"x": "x1",
"y": "y1"
},
{
"id": "abc2",
"x": "x2",
"y": "y2"
},
...
]
}
Я хочу десериализовать это с Джексоном на объект из класса, который выглядит так:
Class A {
Map<String, String> x;
Map<String, String> y;
}
В конце я хочу, чтобы карты внутри объекта A выглядели так:
x = {(abc1, x1), (abc2, x2)}, y = {(abc1, y1), (abc2, y2)}
Есть ли способ аннотировать этот класс с Джексоном, чтобы я мог выполнить эту десериализацию в одной строке? Я не мог найти способ сделать это без изменения дизайна класса A.
В идеале, X и Y будут разделены на два объекта с идентификаторами. Если вам удастся реструктурировать ваш JSON или объект Java, чтобы он лучше соответствовал вашим потребностям, вы бы следовали лучшей практике, и ваш код был бы легче следовать - я понимаю, что не всегда вариант.
Одна вещь, которую вы можете сделать, это создать пользовательский класс, который имитирует структуру объектов внутри вашего массива. Затем вы можете аннотировать конструктор и передать его в список этого настраиваемого объекта. Что-то вроде этого:
public class A {
private Map<String, String> x;
private Map<String, String> y;
@JsonCreator
public A(@JsonProperty("root") List<Entity> entities) {
for (Entity entity : entities) {
x.put(entity.getId, entity.getX());
y.put(entity.getId, entity.getY());
}
}
public static class Entity {
private String id;
private String x;
private String y;
public String getId() {
return id;
}
public String setId(String id) {
this.id = id;
}
public String getX() {
return x;
}
public String setX(String x) {
this.x = x;
}
public String getY() {
return y;
}
public String setY(String y) {
this.y = y;
}
}
}
Я не уверен, что вы подразумеваете под "десериализацией в одной строке". Если вы ищете более легкую альтернативу, единственная вещь, которая может удовлетворить ваши требования, - это индивидуальный десериализатор, который является более сложным.