2012-06-09 2 views
1

я должен перенести следующий код из Джексон 1,9 до 2,0Переносите Джексона JsonDeserializer от 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, поэтому ему не нужна никакая итерация.

ответ

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()); 
} 
+0

Точно. Причина добавления дополнительного типа TreeNode заключалась в уменьшении размера ядра jar: базовый тип JsonNode довольно велик, и ядро ​​действительно не нужно делать то, что у него есть. Это требует upcast для конкретного случая при переходе от основного типа (например, JsonParser или JsonGenerator). – StaxMan

+0

Еще одно замечание: в этом случае вам также понадобится явный листинг: из-за универсального параметра метода простое присвоение 'JsonNode' должно работать без литья (листинг выводится компилятором, добавляется под капотом) / – StaxMan

Смежные вопросы