我想只编辑现有JSON文件中的一个值。
如果不解析和重写整个文件,有没有办法做到这一点? (我使用Jackson Streaming API生成并解析文件,但我不确定Streaming API是否可以这样做。)
我的 Example.json 文件包含以下内容:
{
"id" : "20120421141411",
"name" : "Example",
"time_start" : "2012-04-21T14:14:14"
}
给出的示例:我想将“名称”的值从“示例”编辑为“其他名称”。
答案 0 :(得分:0)
不是我所知道的;无论是在JSON级别还是在文件级别 - 除非值的长度恰好相同,否则底层文件系统通常需要从变换点重写文件的其余部分。
您可以使用Streaming API读取和写入文件,随时取代价值;请参阅JsonGenerator.copyCurrentEvent(jp)
以简化任务 - 它只是按原样复制输入事件。对于除了替换特定值之外的所有内容,您可以调用它;而对于价值,可以致电JsonGenerator.writeString()
。
答案 1 :(得分:0)
如果文件很小并且您要替换的输入值是“足够”,并且您对快速和脏的开放,请使用apache commons-exec或其他东西来解决:
bash$> echo '{
"id" : "20120421141411",
"name" : "Example",
"time_start" : "2012-04-21T14:14:14"
}' | sed -e 's/Example/othername/'
输出:
{
"id" : "20120421141411",
"name" : "othername",
"time_start" : "2012-04-21T14:14:14"
}
如果您知道文件的路径,请使用cat file | sed ...
。
如果您确实想要就地编辑文件,只写入要更改的字节,只有在您编写的数据不会覆盖文件中的后续数据时才有可能。使用上述解决方案之一,你会好得多。
假设JSON文件很大(> 1GB?),那么这种技术会有意义吗?不,你用JSON文件做了多大的事?分开吧!但为了争论......
你真的想要这样做,所以你挂钩到一个JSON解析器来跟踪文件中的字节偏移量,并能够将它绑定到代表你将要操作的JsonNode的对象。你可能最终会编写自己的解析器; JSON语法故意简单。然后你只需打开文件,跳过那个偏移量,然后编写JsonNode数据......除非它会覆盖它之后的东西(你是否在每个值之后用空格缓冲区预先填充文件,以防万一?hmmm ...这开始听起来像数据库问题)。在这种情况下,你最终会重写整个文件的其余部分,因为较大的值会“向下推”其他所有文件。如果编辑总是接近文件末尾,那就没什么大不了的。但如果它们是随机的,那么你的表现就注定要失败。你将瓶颈序列化写入。