如何将多态性与杰克逊的展开结合起来?

Posted

技术标签:

【中文标题】如何将多态性与杰克逊的展开结合起来?【英文标题】: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;
    

【问题讨论】:

【参考方案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;
    

【讨论】:

以上是关于如何将多态性与杰克逊的展开结合起来?的主要内容,如果未能解决你的问题,请参考以下文章

实现多态

php多态

PHP 多态理解

PHP 多态理解

PHP 多态理解

杰克逊的@JsonSubTypes仍然是多态反序列化所必需的吗?