从自定义Jackson Deserializer中的父节点读取字段

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

看看下面的输入JSON:

{
    "importantKey": "123xyz",
    "nested": {
        // more stuff goes here.
    }
}

Nested由具有多种不同实现的接口表示。关键是,为了找出应该用于反序列化的实现,我需要检查importantKey's值。

我目前的解决方案是立即反序列化整个事物:

@Override
public Foo deserialize(JsonParser jp, DeserializationContext dc) 
            throws IOException, JsonProcessingException {

    ObjectMapper objectMapper = (ObjectMapper) jp.getCodec();
    ObjectNode objectNode = objectMapper.readTree(jp);
    String importantKey = objectNode.findValue("importantKey").asText();

    JsonNode nestedNode = objectNode.findValue("nested");
    NestedInterface nested;
    nested = objectMapper.treeToValue(nestedNode, findNestedImplFor(importantKey));

    // construct containing Foo and so on ...
}

这有效,但由于几个不同的原因(特定于我的用例),如果只有nested的反序列化程序可以以某种方式读取或访问外部对象的字段,那将会更加凉爽。

我在一个dropwizard环境中运行jackson 2.8.x.

有人有想法吗?提前致谢!

java json jackson deserialization dropwizard
1个回答
0
投票

您可以通过DeserializationContext访问它,就像这样

Object parent = dc.getParser().getParsingContext().getCurrentValue();

然后将其强制转换为具有'importantKey'字段的相应POJO类型。

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