gpt4 book ai didi

java - 反序列化后再次使用JsonParser

转载 作者:行者123 更新时间:2023-11-30 02:41:20 34 4
gpt4 key购买 nike

我正在尝试扩展 Jackson 默认反序列化,以便在 json 中显式将占位符对象设置为 null 时将占位符对象分配给我的域对象的字段。我正在使用 Spring Boot + Spring Data。我搜索了很多方法来寻找最好的方法,我相信自定义解串器就是我想要的。我也愿意接受有关于此的建议,但我的实际问题是如何使用默认的反序列化并自己处理显式的空分配。这就是我陷入困境的地方(在 MyItemDeserializer 中):

@Override
public Item deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
throws IOException, JsonProcessingException
{
Item item = (Item) defaultDeserializer.deserialize(jsonParser, deserializationContext);
JsonNode root = jsonParser.readValueAsTree();
// traverse the tree to handle {"something":null}
return item;
}

显然,在默认反序列化器处理 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

虽然在这种情况下构建一棵树有点麻烦。

关于java - 反序列化后再次使用JsonParser,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41609953/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com