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