gpt4 book ai didi

java - 使用 Jackson 反序列化接口(interface),其中接口(interface)实现在序列化对象中指定

转载 作者:行者123 更新时间:2023-12-02 09:50:13 26 4
gpt4 key购买 nike

我有以下结构(简化以希望使问题更清晰):

interface Settings {
...
}

interface Component {
...
}

class Container {
Class<? extends Component> component;
Settings settings;
}

@SettingsClass(MySettings.class)
class MyComponent implements Component{
...
}

class MySettings implements Settings{
...
}

如果我使用 Jackson 序列化 Container 的实例,我会得到一个类似于以下内容的 JSON:

{
component: "my.package.MyComponent"
settings: { ... }
}

这正是我想要的。

但我无法反序列化该 JSON,因为 Jackson 不知道要使用哪种设置实现。在运行时,我可以检索 SettingsClass 注释并确定 settings 字段应反序列化到哪个类。

有没有办法让 Jackson 部分反序列化 JSON,然后在我能够检查 组件后让它反序列化其余部分(即 settings) 并确定使用哪个Settings 类?

最佳答案

不是真的。我最近不得不做类似的事情。我解析成 JsonNode 并手动检查属性。

final JsonNode jsonRoot = new ObjectMapper().readTree(jsonString);
//...
Optional.ofNullable(jsonRoot.get("component")).map(JsonNode::textValue) ...

然后将树序列化到 POJO 中。

new ObjectMapper().readerFor(theClass).readValue(jsonRoot)

并不令人惊奇,但至少可以节省两次解析整个字符串的时间。

关于java - 使用 Jackson 反序列化接口(interface),其中接口(interface)实现在序列化对象中指定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56364986/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com