将Jackson JsonDeserializer从1.9迁移到2.0

时间:2012-06-09 14:13:33

标签: json parsing jackson

我必须将以下代码从Jackson 1.9迁移到2.0

public class ObjectIdDeserializer extends JsonDeserializer<ObjectId> {
    @Override
    public ObjectId deserialize(JsonParser jp, DeserializationContext context) {
        JsonNode oid = jp.readValueAsTree().get("$oid");
        return new ObjectId(oid.getTextValue());
    }
}

由于readValueAsTree()的返回类型已从JsonNode更改为TreeNode,因此我无法再访问其值。我已经尝试了hasCurrentToken()nextToken()和其他奇怪的方法,比如那些没有找到优雅访问树节点的方法。我使用的get方法依赖于map,因此不需要任何迭代。

1 个答案:

答案 0 :(得分:3)

杰克逊的ObjectMapper课程:

public <T extends TreeNode> T readTree(JsonParser jp) throws IOException, JsonProcessingException
{
    /* ... */
    JsonNode n = (JsonNode) _readValue(cfg, jp, JSON_NODE_TYPE);
    if (n == null) {
        n = getNodeFactory().nullNode();
    }
    @SuppressWarnings("unchecked")
    T result = (T) n;
    return result;
}
readTree方法调用

readValueAsTree方法,当JsonNode实现TreeNode时,只需将TreeNode对象转换为JsonNode对象,你会得到你期望的结果!

@Override
public ObjectId deserialize(JsonParser jp, DeserializationContext context) {
    JsonNode oid = ((JsonNode)jp.readValueAsTree()).get("$oid");
    return new ObjectId(oid.asText());
}