【问题标题】:How can I combine polymorphism with unwrapping in Jackson?如何将多态性与杰克逊的展开结合起来?
【发布时间】:2022-01-21 03:13:54
【问题描述】:

我正在使用 jackson 为 json 序列化/反序列化编写带注释的模型类。

我有一个包含映射的 json,其中键是枚举,值可以是不同的类型(包括数组),具体取决于键值。

一个简化的例子,这就是我需要的:

{
 "key1": "string value",
 "key2": [{"id":"1", "value": "test1"}, {"id":"2", "value": "test2"}]
}

我试过了,我明白了:

{
  "KEY1": {"value": "string value"},
  "KEY2": {"list": [{"id": "1", "value": "test1"}, {"id": "2", "value": "test2"}]}
}

所以,解包不起作用。

谁能告诉我我做错了什么?

代码如下:

public class Main {

    public static void main(String[] args) throws Exception {

        HashMap<Keys, ValueType> map = new HashMap<>();

        map.put(Keys.KEY1, new StringValue("string value"));

        map.put(Keys.KEY2, new ListValue( Arrays.asList(new Element[] {
                new Element("1", "test1"),
                new Element("2", "test2")
        } )));

        ObjectMapper objectMapper = new ObjectMapper();
        String s = objectMapper.writeValueAsString(map);

        System.out.println(s);

    }
}

public enum Keys {

    KEY1("key1"),
    KEY2("key2");

    private String value;

    Keys(String s) {
        this.value = s;
    }
}

public interface ValueType {

}

public class StringValue implements ValueType {

    @JsonUnwrapped
    private String value;

    public StringValue(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

public class ListValue implements ValueType {

    @JsonUnwrapped
    private List<Element> list;

    public ListValue(List<Element> list) {
        this.list = list;
    }

    public List<Element> getList() {
        return list;
    }

    public void setList(List<Element> list) {
        this.list = list;
    }
}

public class Element {

    @JsonProperty
    private String id;
    @JsonProperty
    private String value;

    public Element(String id, String value) {
        this.id = id;
        this.value = value;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

【问题讨论】:

    标签: java json jackson


    【解决方案1】:

    您可以使用JsonValue 注释来注释类的getters 方法,该注释指示带注释的访问器的值将用作实例序列化的单个值,而不是通常的收集属性的方法价值

    public class StringValue implements ValueType {
    
        @JsonUnwrapped
        private String value;
    
        public StringValue(String value) {
            this.value = value;
        }
        @JsonValue //<-- added annotation to the original getter method
        public String getValue() {
            return value;
        }
    
        public void setValue(String value) {
            this.value = value;
        }
    }
    
    public class ListValue implements ValueType {
    
        @JsonUnwrapped
        private List<Element> list;
    
        public ListValue(List<Element> list) {
            this.list = list;
        }
    
        @JsonValue //<-- added annotation to the original getter method
        public List<Element> getList() {
            return list;
        }
    
        public void setList(List<Element> list) {
            this.list = list;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-08-30
      • 2013-10-05
      • 1970-01-01
      • 1970-01-01
      • 2016-01-08
      • 2017-05-03
      • 2017-08-04
      • 2021-09-05
      • 1970-01-01
      相关资源
      最近更新 更多