Jackson:将表示单字段POJO的Map<String,Object>的JSON转换为字段值的Map<String,String>?



我有一个复杂的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库

相关内容

最新更新