我有一个复杂的JSON
对象,如下所示:
{
unneededObject1: {...},
unneededObject2: {...},
....,
bigTargetObject: {
"ABC": {
targetField: "1234",
unneededField1: "abcd",
unneededField2: "abcd",
...
},
"DEF": {
targetField: "2345",
unneededField1: "abcd",
unneededField2: "abcd",
...
},
...
}
}
根包含许多对象,我需要挑选一个,它是一个内部对象列表(每个对象由一个唯一的字符串标识)。我的目标输出是一个简单的Map<String,String>
,像这样:
{
"ABC": "1234",
"DEF": "2345",
...
}
我可以想到通过迭代对象和转换事物来做到这一点的方法,但我正在尝试找到使用jackson注释对象的最干净的方法来做到这一点。我的目标可以这样使用:
JsonNode entireGiantObject = callService(...);
MyObjectType temp = mapper.convertValue(entireGiantObject, MyObjectType.class);
Map<String,String> targetMap = temp.getTargetMap();
到目前为止,我已经隔离了"bigTargetObject"内部"targetField"通过如下方式创建一对类:
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ToString
@JsonIgnoreProperties(ignoreUnknown = true)
public class MyObjectType {
private Map<String, TargetField> targetMap;
@JsonProperty("bigTargetObject")
private void renameMap(Map<String, TargetField> bigTargetObject) {
this.targetMap = bigTargetObject;
}
}
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ToString
@JsonIgnoreProperties(ignoreUnknown = true)
public class TargetField {
private String targetField;
}
所以在这一点上,我的结果是类型Map<String,TargetField>
。什么是最干净的方法,更进一步,自动产生Map<String,String>
?注意"TargetField"类的存在只是为了过滤原始JSON中的字段名,否则它只是单个String的包装器。
可以使用com.fasterxml.jackson.annotation.JsonAnySetter
注释。将MyObjectType
更改为:
@Data
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
class MyObjectType {
private Map<String, TargetField> targetMap = new HashMap<>();
@JsonAnySetter
private void renameMap(String key, TargetField targetField) {
targetMap.put(key, targetField);
}
}
,你可以这样读:
JsonNode bigO = entireGiantObject.get("bigTargetObject");
MyObjectType myObjectType = mapper.convertValue(bigO, MyObjectType.class);
System.out.println(myObjectType);
你也可以使用JsonPath库