如何将此 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。
假设我有以下 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。