Аннотации Джексона для легкой десериализации JSON

1

У меня есть 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.

  • 2
    Нет, этот json не отображается просто на этот класс java.
  • 0
    выглядит как List <Map <String, String> для меня. Вы определили картограф?
Показать ещё 3 комментария
Теги:
serialization
jackson

1 ответ

1

В идеале, 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;
        }
    }
}

Я не уверен, что вы подразумеваете под "десериализацией в одной строке". Если вы ищете более легкую альтернативу, единственная вещь, которая может удовлетворить ваши требования, - это индивидуальный десериализатор, который является более сложным.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню