2

我只想编辑现有 JSON 文件中的一个值。

有没有办法在不解析和重写整个文件的情况下做到这一点?(我使用 Jackson Streaming API 来生成和解析文件,但我不确定 Streaming API 可以做到这一点)。

我的Example.json文件包含以下内容:

{ 
"id" : "20120421141411",
"name" : "Example",
"time_start" : "2012-04-21T14:14:14"
}

给出的示例:我想将“名称”的值从“示例”编辑为“其他名称”。

4

2 回答 2

0

从来没听说过; 无论是在 JSON 级别,还是在文件级别——除非值的长度恰好完全相同,否则底层文件系统通常需要从更改点重写文件的其余部分。

您可以使用 Streaming API 读取和写入文件,随时随地替换值;请参阅JsonGenerator.copyCurrentEvent(jp)以简化任务——它只是按原样复制输入事件。对于除了替换特定值之外的所有内容,您都可以调用它;并且为了价值,可以调用JsonGenerator.writeString().

于 2012-04-22T02:52:53.310 回答
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 数据......除非它会覆盖它之后的东西(你是否在每个值之后用空间缓冲区预先填充文件,以防万一?嗯? ...这听起来像是一个数据库问题)。在这种情况下,您最终将重写文件的整个其余部分,因为较大的值会将其他所有内容“向下推”。如果编辑总是在文件末尾附近,这没什么大不了的。但如果它们是随机的,你的表现就注定了。您将成为序列化写入的瓶颈。

于 2014-10-31T05:49:50.173 回答