在将 JSON 反序列化为 Java 对象时映射动态字段名称
Map dynamic field names while deserializing a JSON to a Java object
我有一个有趣的问题想要解决。这是在我解析来自我们与之交互的平台之一的响应时。响应根据用户而变化。
对于用户 A,我有以下 JSON :
{
"userId": "AA001",
"AA001_Name": "Username",
"AA001_Email": "user@gmail.com",
"AA001_Phone": "000-000-0000"
}
对于用户 B,我有:
{
"userId" : "AA002",
"AA002_Name" : "Username",
"AA002_Email" : "user@gmail.com",
"AA002_Phone" : "000-000-0000"
}
现在,在反序列化时,我想将它们都映射到以下对象,忽略 json 附带的字段名称:
class User {
private String userId,
private String name,
private String email,
private String phone
}
映射 userId 很容易,因为它也是 JSON 中的字段,但是自定义字段呢?
现在,我无法使用 @JsonProperty,因为字段名称会根据用户动态变化。
有什么方法可以实现吗?
请注意,我可能有几个这样的自定义对象,如部门、组织等,平台 returns 数据以这种方式显示,这意味着键附加了用户特定的信息。
感谢任何帮助。我对此深陷其中。
您不能按原样使用@JSON属性,但是如果您在反序列化 JSON 之前重新格式化密钥会怎样?即
String key = "AA001_Name"
String[] key = key.split("_")
key[0] = "AA001"
key[1] = "Name"
//Use key[1] as the new field name
对每个键执行此操作,使用正确的字段名称创建一个新的 JSON 对象,然后反序列化它。
我认为没有比使用 @JsonCreator
:
更好的方法了
class User {
private String userId;
private String name;
private String email;
private String phone;
@JsonCreator
public User(Map<String, Object> map) {
this.userId = (String) map.get("userId");
map.entrySet().stream()
.filter(e -> e.getKey().endsWith("_Name"))
.findFirst()
.ifPresent(e -> this.name = (String) e.getValue());
// repeat for other fields
}
// getters & setters (if needed)
}
您可以通过传统方式更改地图条目集上的每个流以优化性能。
我有一个有趣的问题想要解决。这是在我解析来自我们与之交互的平台之一的响应时。响应根据用户而变化。
对于用户 A,我有以下 JSON :
{
"userId": "AA001",
"AA001_Name": "Username",
"AA001_Email": "user@gmail.com",
"AA001_Phone": "000-000-0000"
}
对于用户 B,我有:
{
"userId" : "AA002",
"AA002_Name" : "Username",
"AA002_Email" : "user@gmail.com",
"AA002_Phone" : "000-000-0000"
}
现在,在反序列化时,我想将它们都映射到以下对象,忽略 json 附带的字段名称:
class User {
private String userId,
private String name,
private String email,
private String phone
}
映射 userId 很容易,因为它也是 JSON 中的字段,但是自定义字段呢?
现在,我无法使用 @JsonProperty,因为字段名称会根据用户动态变化。
有什么方法可以实现吗? 请注意,我可能有几个这样的自定义对象,如部门、组织等,平台 returns 数据以这种方式显示,这意味着键附加了用户特定的信息。
感谢任何帮助。我对此深陷其中。
您不能按原样使用@JSON属性,但是如果您在反序列化 JSON 之前重新格式化密钥会怎样?即
String key = "AA001_Name"
String[] key = key.split("_")
key[0] = "AA001"
key[1] = "Name"
//Use key[1] as the new field name
对每个键执行此操作,使用正确的字段名称创建一个新的 JSON 对象,然后反序列化它。
我认为没有比使用 @JsonCreator
:
class User {
private String userId;
private String name;
private String email;
private String phone;
@JsonCreator
public User(Map<String, Object> map) {
this.userId = (String) map.get("userId");
map.entrySet().stream()
.filter(e -> e.getKey().endsWith("_Name"))
.findFirst()
.ifPresent(e -> this.name = (String) e.getValue());
// repeat for other fields
}
// getters & setters (if needed)
}
您可以通过传统方式更改地图条目集上的每个流以优化性能。