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

时间:2016-10-22 13:21:27

标签: java json jackson deserialization dropwizard

查看以下输入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的反序列化器可以以某种方式读取或访问外部对象的字段,那将会更加凉爽。 / p>

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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