gpt4 book ai didi

java - jackson JSON 流 API : Read an entire object directly to String

转载 作者:行者123 更新时间:2023-11-29 03:31:26 25 4
gpt4 key购买 nike

我正在尝试逐个对象地传入 JSON 数组,但我需要将其作为原始 JSON 字符串导入。

给定一个像这样的输入数组:

[
{"object":1},
{"object":2},
...
{"object":n}
]

我正在尝试遍历字符串:

{"object":1}
{"object":2}
...
{"object":n}

我可以使用流式 API 导航结构以验证我遇到了一个对象,等等,但我认为我取回我的字符串的方式是理想的。

目前:

//[...]
//we have read a START_OBJECT token
JsonNode node = parser.readValueAsTree();
String jsonString = anObjectMapper.writeValueAsString(node);
//as opposed to String jsonString = node.toString() ;
//[...]

我想整个 JsonNode 结构的构建涉及大量开销,如果我只是重新序列化,这是毫无意义的,所以我正在寻找更好的解决方案。类似这样的东西是理想的:

//[...]
//we have read a START_OBJECT token
String jsonString = parser.readValueAsString()
//or parser.skipChildrenAsString()
//[...]

对象显然没有

那么简单
{"object":1}

这就是为什么我不想浪费时间做无意义的节点构建。可能有一些理想的方法,涉及将内容映射到对象并使用它,但我无法做到这一点。我需要原始 JSON 字符串,一次一个对象,以处理现有代码。

如有任何建议或意见,我们将不胜感激。谢谢!

编辑: parser.getText() 将当前标记作为文本返回(例如 START_OBJECT -> "{"),但不返回对象的其余部分。

Edit2 : 使用 Streaming API 的动机是一个一个地缓冲对象。实际的json文件可能会很大,而且每个对象都可以用完就丢弃,所以我只需要遍历即可。

最佳答案

无法避免 JSON 标记化(否则解析器将不知道对象的开始和结束位置等)​​,因此它总是涉及某种级别的解析和生成。

但是您可以通过将值读取为 TokenBuffer 来稍微减少开销——它是 Jackson 的内部类型,具有最低的内存/性能开销(并且在需要缓冲的时候在内部使用):

TokenBuffer buf = parser.readValueAs(TokenBuffer.class);
// write straight from buffer if you have JsonGenerator
jgen.writeObject(buf);
// or, if you must, convert to byte[] or String
byte[] stuff = mapper.writeValueAsBytes();

但是我们可以做得更好:如果您可以为输出创建 JsonGenerator,只需使用 JsonGenerator.copyCurrentStructure(JsonParser);:

jgen.copyCurrentStructure(jp); // points to END_OBJECT after copy

这将避免所有对象分配;虽然它需要解码 JSON,然后编码回 JSON,但它会非常高效。事实上,您甚至可以将其用于转码——读取 JSON,写入 XML/Smile/CSV/YAML/Avro——在 Jackson 支持的任何格式之间。

关于java - jackson JSON 流 API : Read an entire object directly to String,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18050519/

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