我如何映射与我的实体在JSON中返回的字段,前提是JSON中的键具有与我的实体中的字段不同的名称

时间:2019-06-29 18:49:42

标签: spring spring-boot resttemplate

我正在尝试将JSON响应映射到Java POJO,该Java POJO具有与其他API不同的字段名称。 我需要一种有效的方法来减少样板代码。

我尝试映射Java POJO中的JSON属性字段。 但是,问题是我正在从不同来源获取数据。

假设我的用户类别如下

    Class User{
       String name;
       String contact;
    }

我可能会从不同来源收到的JSON

{"name": "ABC" , "contact": "123456"}

or
{"userName": "XYZ" , "mobileNo":"4354665"}

随着我们继续集成更多的API,可能会有更多的变化

有没有办法将其存档? 上面只是一个简单的例子

可能需要读取更复杂的JSON对象。 例如用户列表等。

2 个答案:

答案 0 :(得分:2)

您可以使用@JsonAlias()为变量提供多个JSON键绑定。

  

@JsonAlias在Jackson 2.9版本中引入。 @JsonAlias为反序列化期间接受的属性定义一个或多个备用名称,即将JSON数据设置为Java对象。但是在序列化时,即从Java对象获取JSON时,仅使用实际的逻辑属性名称,而不使用别名。 @JsonAlias的定义如下。

@Entity
Class User{

   @JsonProperty()
   @JsonAlias({"name", "userName"})
   String name;

   @JsonProperty()
   @JsonAlias({"contact", "mobileNo"})
   String contact;
}

答案 1 :(得分:0)

您可以使用@JsonSetter注释,如:

public class User{
    public String contact;
    public String name;

    @JsonSetter("name")
    public void setName(String name) {
      this.name = name;
    }

    @JsonSetter("userName")
    public void setName(String name) {
      this.name = name;
    }
}

您应该在两者之间有一个DTO对象或模型来映射json响应,而不是直接映射到实体类。然后,您可以将其转换为您选择的任何实体。如果您要从不同的来源获取数据,则意味着您在调用不同的端点,为什么不为此创建不同的DTO。的端点引入了更改,不会影响其余的端点调用。

反之亦然,您可以从两个端点返回不同的DTO对象,而不是也返回相同的Entity类,这样您就可以控制响应中应该包含哪些属性。

要减少样板代码,您可以使用MAP STRUCT之类的库来轻松地在实体和DTO对象之间进行转换

阅读here,了解使用DTO的优势。