杰克逊注释易于JSON反序列化

时间:2014-07-04 04:20:46

标签: java json serialization jackson

我有一个JSON文件,如下所示:

{
    "root": [
              {
                "id": "abc1",
                "x": "x1",
                "y": "y1"
              },
              {
                "id": "abc2",
                "x": "x2",
                "y": "y2"
              },
       ...
            ]
}

我想用Jackson将其反序列化为类似于以下类的对象:

Class A {
    Map<String, String> x;
    Map<String, String> y;
}

最后,我希望A对象内的地图看起来像:

x = {(abc1,x1),(abc2,x2)}, y = {(abc1,y1),(abc2,y2)}

有没有办法用Jackson注释这个类,以便我可以在一行中进行反序列化?如果不改变A类的设计,我无法找到办法。

1 个答案:

答案 0 :(得分:1)

理想情况下,X和Y将分为两个带ID的对象。如果您可以重新构建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;
        }
    }
}

我不确定你的意思是“在一行中反序列化”。如果您正在寻找更容易的替代方案,那么唯一能够满足您要求的是自定义解串器,这更复杂。