Jackson 的 JsonSerializer 不适用于深层嵌套对象层次结构

问题描述 投票:0回答:1

对于 Java 对象实例的序列化,我使用 Jackson 库并构建了几个 JsonSerializers,它们应该单独检查

Player.class
Vehicle.class
Building.class
并相应地转换它们。我将侦听器注册为 SimpleModules,然后通过 ObjectMapper 使用
convertValue()
映射实例。

然而,这个过程实际上效果很好。映射器独立识别类的相应实例出现的位置,并将它们通过注册的序列化器传递。

然而,我的问题是它不再在一定级别的渐变水平上工作。如果车辆直接位于玩家对象的列表中,则它们会被序列化。但是,如果它们低一级,即在播放器实例的另一个列表的项目中(参见

parkedVehicles
),则序列化器将不再识别它们。

diagram

        Player p = ...;
        ObjectMapper mapper = new ObjectMapper().configure(MapperFeature.REQUIRE_SETTERS_FOR_GETTERS, true);
        ObjectNode objectNode = mapper.createObjectNode();

        SimpleModule module = new SimpleModule();
        module.addSerializer(Player.class, new PlayerSerialization());
        module.addSerializer(Building.class, new BuildingSerialization());
        module.addSerializer(Vehicle.class, new VehicleSerialization());
        mapper.registerModule(module);

        objectNode.set("player", mapper.convertValue(p, ObjectNode.class));
java json serialization jackson objectmapper
1个回答
0
投票

我做了一些进一步的研究并尝试了一下,发现了一个新问题: 只要将相应的对象直接传递给

mapper.convertValue()
,转换器/序列化器似乎就可以工作。 任何类型的嵌套都会导致序列化器的无知。例如:

objectNode.set("you", mapper.convertValue(event.getUser(), ObjectNode.class));

...不会像

headquarter
那样转换嵌套用户字段。它们只是默认打印。同时,如果我使用:

objectNode.set("you", mapper.convertValue(u.getHeadquarter(), ObjectNode.class));

...转换器将按预期应用并转换对象。

这里是一个使用 StdConverter 的示例,它不适用于注册侦听器类型的任何嵌套对象。

总结:我当前使用

StdConverter
的方法不适用于 任何类型的嵌套对象。它们只是默认打印。

我对造成的混乱感到非常抱歉,因此我原来的帖子似乎有点错误。

您知道如何处理嵌套对象以便正确转换它们吗? 😊

© www.soinside.com 2019 - 2024. All rights reserved.