在将 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)
}

您可以通过传统方式更改地图条目集上的每个流以优化性能。