【问题标题】:Migrate a Jackson JsonDeserializer from 1.9 to 2.0将 Jackson JsonDeserializer 从 1.9 迁移到 2.0
【发布时间】:2012-06-09 14:13:32
【问题描述】:

我必须将以下代码从 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,因此不需要任何迭代。

【问题讨论】:

    标签: json parsing jackson


    【解决方案1】:

    根据 Jackson 的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());
    }
    

    【讨论】:

    • 没错。添加额外的TreeNode 类型的原因是为了减小核心jar 的大小:JsonNode 基本类型相当大,核心并不真正需要做它所拥有的。但是,从核心类型(如JsonParserJsonGenerator)开始时,这确实需要针对特定​​情况进行向上转换。
    • 还有一点需要注意:在这种情况下,您甚至应该需要显式转换:由于泛型方法参数,对JsonNode 的简单赋值应该可以在没有转换的情况下工作(转换由编译器推断,在幕后添加) /
    猜你喜欢
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多