Java 反序列化后再次使用JsonParser

Java 反序列化后再次使用JsonParser,java,jackson,spring-data,Java,Jackson,Spring Data,我试图扩展Jackson默认的反序列化,以便在json中将占位符对象显式设置为null时,将占位符对象分配给我的域对象的字段。我使用的是Spring启动+Spring数据。我寻找了很多最好的方法来做它,我相信一个自定义反序列化是我想要的。我也愿意就此提出建议,但我的实际问题是如何使用默认的反序列化并自己处理显式空赋值。这就是我被卡住的地方(在MyItemDeserializer中): 显然,在默认反序列化程序处理后,jsonParser对象readValueAsTree返回null。有没有办法在

我试图扩展Jackson默认的反序列化,以便在json中将占位符对象显式设置为null时,将占位符对象分配给我的域对象的字段。我使用的是Spring启动+Spring数据。我寻找了很多最好的方法来做它,我相信一个自定义反序列化是我想要的。我也愿意就此提出建议,但我的实际问题是如何使用默认的反序列化并自己处理显式空赋值。这就是我被卡住的地方(在MyItemDeserializer中):


显然,在默认反序列化程序处理后,jsonParser对象
readValueAsTree
返回null。有没有办法在默认反序列化后将json作为树(或任何其他内容)使用?

如果我正确理解了您的问题,您需要做的是颠倒您的代码:而不是按原样传递
JsonParser
,然后尝试重新读取,您应该首先读取内容,从它们中创建
JsonParser
,并重新使用这些内容

一种方法是将内容读取为
JsonNode
,并使用
com.fasterxml.jackson.databind.node.TreeTraversingParser
构造解析器:

JsonParser p2 = new TreeTraversingParser(node);
Item item = (Item) defaultDeserializer.deserialize(p2, deserializationContext);
另一种可能是将内容读取为
TokenBuffer
,并从中构造2个解析器:这是内部代码用于缓冲的内容。 这将类似于:

TokenBuffer buf = new TokenBuffer(jsonParser);
b.copyCurrentStructure(jsonParser);
JsonParser p2 = buf.asParser(); // for default deserializer
JsonParser p3 = buf.asParser(); // for further processing, read as tree, whatever

尽管在这种情况下构建树有点麻烦。

不知道TreeTraversingParser。谢谢它是位隐藏的,通过
JsonNode
中的方法或类似的(“Aspaser()”或类似的东西)来公开它可能是有意义的。TreeTraversingParser方法对我也很有用。另一个没有(令牌缓冲区)。从tokenbuffer创建的新解析器不包含来自第一个解析器的对象。这两个解析器都不适用于我。当我尝试使用上述任何一种解决方案时,我只是收到了意外的输入结束。如何获取TreeTraversingParser构造函数的节点?从原始解析器中取出节点似乎已经将该解析器设置为其流的末尾,因此在此之后,它的任何副本都将无效。不,
节点
没有流的概念,它与源(解析器或显式构建)完全解耦。然而,节点确实具有要遍历的结构,可以显式遍历,也可以构造单独的
TreeTraversingParser
。需要注意的是,在创建解析器时,它最初并不指向任何东西,因此必须调用
nextToken()
或等效函数。
TokenBuffer buf = new TokenBuffer(jsonParser);
b.copyCurrentStructure(jsonParser);
JsonParser p2 = buf.asParser(); // for default deserializer
JsonParser p3 = buf.asParser(); // for further processing, read as tree, whatever