java - 有没有办法使用 Jackson ObjectMapper(没有自定义 @JsonCreator)将此 Json 解码到提供的 Java Dto?

标签 java json spring spring-boot jackson

我有两个 Java 类:

public class Request
{
    private List<Item> subItems;

    public Request()
    {
    }

    public List<Item> getSubItems()
    {
        return subItems;
    }

    public void setSubItems(List<Item> subItems)
    {
        this.subItems = subItems;
    }
}

class Item
{
    private String name;
    private String functionName;

    //...elided...
}

将传递的subItems可以很复杂(包括一个函数)或简单(只是一个名称)。这些可以是混合的。为了简化 JSON,我希望能够接受以下内容:

JSON:

{
  "subItems": [
    {
      "name": "complexType",
      "function": "someFunction"
    },
    "simpleType"
  ]
}

然后将其转换为以下实例的等价:

Request request = new Request();
request.setSubItems(
    Arrays.asList(
        new Item( "complexType", "SomeFunction" ),
        new Item( "simpleType" )
    )
);

这可以用 Jackson/ObjectMapper 实现吗? 我需要什么设置和注释?

最佳答案

如果您的 Item 类具有字符串构造函数,则会使用 “simpleType” 值调用该构造函数。

class Item {
    private String name;
    private String functionName;

    public Item() {
    }

    public Item(String name) {
        this.name = name;
    }

    // getters and setters here
}

完整演示

public class Request {
    public static void main(String[] args) throws IOException {
        String json = "{\"subItems\":[" +
                          "{\"name\":\"complexType\",\"functionName\":\"SomeFunction\"}," +
                          "\"simpleType\"" +
                      "]}";
        Request request = new ObjectMapper().readValue(json, Request.class);
        System.out.println(request);
    }

    private List<Item> subItems;
    public Request() {
    }
    public Request(Item... subItems) {
        this.subItems = Arrays.asList(subItems);
    }
    public List<Item> getSubItems() {
        return this.subItems;
    }
    public void setSubItems(List<Item> subItems) {
        this.subItems = subItems;
    }
    @Override
    public String toString() {
        return "Request [subItems=" + this.subItems + "]";
    }
}
class Item {
    private String name;
    private String functionName;
    public Item() {
    }
    public Item(String name) {
        this.name = name;
    }
    public Item(String name, String functionName) {
        this.name = name;
        this.functionName = functionName;
    }
    public String getName() {
        return this.name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getFunctionName() {
        return this.functionName;
    }
    public void setFunctionName(String functionName) {
        this.functionName = functionName;
    }
    @Override
    public String toString() {
        return "Item [name=" + this.name + ", functionName=" + this.functionName + "]";
    }
}

输出

Request [subItems=[Item [name=complexType, functionName=SomeFunction], Item [name=simpleType, functionName=null]]]

关于java - 有没有办法使用 Jackson ObjectMapper(没有自定义 @JsonCreator)将此 Json 解码到提供的 Java Dto?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54241939/

相关文章:

Spring Security & Active Directory LDAP 错误 32 问题 2001 (NO_OBJECT)

java - 在spring mvc maven项目中添加外部项目

java - While 循环与日历交互

java - Libgdx - 输入处理 [Android]。关于听众,我有什么不明白的?

json - Node.js 中使用 mongoose 将 JSON 插入 mongoDB 失败

c - 如何从 json 字符串中获取值?

javascript - 对于转换为 `label` 和 `value` 的 JSON 流,jQuery 自动完成结果框不显示

java - struts.xml中package元素的namespace属性中的 "/"是什么意思?

java - 单击后退按钮时使用 PutExtra 发送数据

java - 带有 Elasticsearch 的Spring Boot导致java.lang.NoSuchFieldError : IGNORE_DEPRECATIONS