我正在尝试将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对象。 例如用户列表等。
答案 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的优势。