提问人:WolfiG 提问时间:11/15/2023 更新时间:11/15/2023 访问量:25
使用 Jackson.databind ObjectMapper 保存/加载/解析 JSON 时出现问题
Problem with saving/loading/parsing JSON using Jackson.databind ObjectMapper
问:
摘要/问题:如何使用 jackson-databind ObjectMapper 将复杂的数据结构保存和加载到 JSON 或从 JSON 加载?就我而言,jackson 无法重新建立 JSON 字符串中 id 引用的对象。
详:我正在通过Jackson.databind将具有以下结构的数据保存到JSON格式的文件中:
class Container {
private HeaderClass header;
private List<Class1> class1Data;
private List<Class2> class2Data;
public String generateJsonString() {
List<Object> outputWrapper = new ArrayList<>();
outputWrapper.add(header);
outputWrapper.add(class1Data);
outputWrapper.add(class2Data);
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule("Serializer/Deserializer module for DeviceAutomator configuration data")
.registerSubtypes(
HeaderClass.class,
Class1.class,
Class2.class);
mapper.registerModule(module);
mapper.writeValueAsString(outputWrapper);
}
... public field accessors, other methods ...
}
类 Class1 和 Class2 是抽象类 ParentClass 的子类,如下所示:
abstract class ParentClass {
private String name;
List<SomeEnum> enumItemList;
... getters and setters ...
}
除了这个列表之外,Class1 和 Class2 还有许多简单的字段。
现在,如果我创建一个 JSON 字符串,原则上一切正常。但是,中的项目被解析为一些更复杂的结构。输出如下所示:generateJsonString()
enumItemList
[ {
"headerField1" : false,
"headerField2" : 1000.0,
... some more header fields ...
}, [ { // List<Class1>.item1:
"class1Field1" : 2.2523,
... more simple fields ...
"enumItemList" : [ {
"@type" : "SomeEnum",
"@id" : "5cfd18f7-5f12-4434-8a5f-c9e0e6baaf5b",
"name" : "name1"
}, {
"@type" : "SomeEnum",
"@id" : "8101bc72-2bbc-4ddd-b8b0-c70f26a84fd9",
"name" : "name2"
},
... more list items ...
]}, { // List<Class1>.item2:
"class1Field1" : 2.2523,
... more simple fields ...
"enumItemList" : [ "5cfd18f7-5f12-4434-8a5f-c9e0e6baaf5b", "8101bc72-2bbc-4ddd-b8b0-c70f26a84fd9", ... more ids from above ... ],
} ], [ { // List<Class2>.item1:
"class2Field1" : field1Value,
"class2Field2" : field2Value,
... more fields ...,
"enumItemList" : [ "5cfd18f7-5f12-4434-8a5f-c9e0e6baaf5b", ... more ids ... ]
} ] ]
如果我从文件中读回此字符串以重建我的数据对象,则代码无法将引用解析回完全展开的对象,但它适用于完全指定的 SomeEnum 项。"enumItemList": [ id1, id2, ...]
这是我从文件中处理 Json 字符串的方式:
ObjectMapper jsonMapper = new ObjectMapper();
jsonMapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
jsonMapper.enable(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE);
jsonMapper.registerModule(module); // module from above
答: 暂无答案
评论
SomeEnum
@JsonIdentityReference