如何将此 json 映射到 java 中的自定义 class

How to map this json to a custom class in java

假设我有以下 json

[
    {
        "00080005":{
            "vr":"CS",
            "Value":[
                "ISO_IR 100"
            ]
        },
        "00080054":{
            "vr":"AE",
            "Value":[
                "DCM4CHEE"
            ]
        }
    }
]

如何创建自定义 class 以将此映射到 java? 我试过这个 class 形状

public class custom1 {
    private Map<String, cusomt2> id;
}

cusomt2形状是

public class cusomt2 {
    private Object vr;
    private Object[] Value;
}

并使用 Jackson 映射器进行映射

ObjectMapper mapper = new ObjectMapper();
List<custom1> test = Arrays.asList(mapper.readValue(responseStream, custom1[].class));

符合预期,给我一个错误:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "00080005"

我想要“0008005”作为字段值而不是字段键,这些值是根据API动态变化的,那么如何映射这个json,有没有其他直接的方法最后一个选项自定义反序列化?

错误提示没有id字段导致反序列化失败

但是,输入 JSON 表示 list/array 个映射 Map<String, Pojo>,其中 Pojo 应定义为:

@Data
class Pojo {
    String vr;
    String[] value;
}

然后 JSON 应该使用 TypeReference 反序列化:

String json = ...; // long json string
ObjectMapper mapper = new ObjectMapper();
List<Map<String, Pojo>> data = mapper.readValue(json, new TypeReference<>() {});

我知道是什么问题了,其实有两个问题,@Alex Rudenko 解决了一个,另一个问题是 API returns Value 是大写字母,不是value,实际上我在class中正确指定为Value,但问题是它是私有的属性,并且getter命名为getValue ],这在映射时混淆了杰克逊,它将 getValue 视为 value 字段的 getter 而不是 Value

  • 第一个解决方案(推荐)是在 class 中的 Value 属性 上设置 @JsonProperty("Value") 注释。

所以 class 现在看起来像这样

public class custom1 {

    private String vr;
    @JsonProperty("Value")
    private String[] Value;

    //getter & setters
}
  • 第二个解决方案是将 Value 设为 public,以避免使用它的 getter。