使用 Jackson.databind ObjectMapper 保存/加载/解析 JSON 时出现问题

Problem with saving/loading/parsing JSON using Jackson.databind ObjectMapper

提问人:WolfiG 提问时间:11/15/2023 更新时间:11/15/2023 访问量:25

问:

摘要/问题:如何使用 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
java json 杰克逊数据绑定

评论

0赞 Benjamin Peter 11/15/2023
您没有像这样提供类的映射配置,因此很难知道发生了什么。但是你有没有看过这里提到的注释 stackoverflow.com/a/38445604/405793SomeEnum@JsonIdentityReference

答: 暂无答案