如何在现有JSON文件中编辑一个值而不进行全部解析?

如何在现有JSON文件中编辑一个值而不进行全部解析?,json,jackson,Json,Jackson,我只想编辑现有JSON文件中的一个值 有没有办法不用解析和重写整个文件就可以做到这一点?(我使用Jackson流媒体API来生成和解析文件,但我不确定流媒体API是否可以做到这一点) my Example.json文件包含以下内容: { "id" : "20120421141411", "name" : "Example", "time_start" : "2012-04-21T14:14:14" } 给出的示例:我想将“name”的值从“Example”编辑为“other name”。我不

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

有没有办法不用解析和重写整个文件就可以做到这一点?(我使用Jackson流媒体API来生成和解析文件,但我不确定流媒体API是否可以做到这一点)

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

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

给出的示例:我想将“name”的值从“Example”编辑为“other name”。

我不知道;无论是在JSON级别,还是在文件级别——除非值的长度恰好相同,否则底层文件系统通常要求从更改点重写文件的其余部分


您可以使用流式API读写文件,随时替换值;请参见
JsonGenerator.copyCurrentEvent(jp)
以简化该任务——它只按原样复制输入事件。对于除替换特定值之外的所有内容,您可以称之为;对于值,可以调用
JsonGenerator.writeString()

这是我所不知道的;无论是在JSON级别,还是在文件级别——除非值的长度恰好相同,否则底层文件系统通常要求从更改点重写文件的其余部分


您可以使用流式API读写文件,随时替换值;请参见
JsonGenerator.copyCurrentEvent(jp)
以简化该任务——它只按原样复制输入事件。对于除替换特定值之外的所有内容,您可以称之为;对于值,可以调用
JsonGenerator.writeString()

如果文件很小,并且您要替换的输入值“足够”唯一,并且您可能会遇到快速和肮脏的问题,请使用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数据。。。除非它将在它之后覆盖某些内容(您是否在每个值之后用缓冲区空间预先填充文件,以防万一?嗯……这听起来像是数据库问题)。在这种情况下,当较大的值向下“推”其他所有内容时,您将重写文件的整个其余部分。如果编辑总是在文件末尾附近,那没什么大不了的。但如果它们是随机的,你的表现就注定了。您将成为序列化写入的瓶颈。

如果文件很小,并且您要替换的输入值“足够”唯一,并且您可能会遇到快速和肮脏的问题,请使用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数据。。。除非它将在它之后覆盖某些内容(您是否在每个值之后用缓冲区空间预先填充文件,以防万一?嗯……这听起来像是数据库问题)。在这种情况下,当较大的值向下“推”其他所有内容时,您将重写文件的整个其余部分。如果编辑总是在文件末尾附近,那没什么大不了的。但如果它们是随机的,你的表现就注定了。您将无法序列化写入内容。

我很困惑。这会把它复制到发电机上吗?什么是活动?我也有类似的问题,需要修改json字符串,但我无法从您的回答中看出这一点。这是针对Jackson Streaming API的,其中
JsonParser
用于将json作为事件序列读取(
JsonToken
);和
JsonGenerator
将JSON内容编写为类似事件。您可以简单地将解析器连接到生成器,让它在大部分时间内复制事件;除了要修改的添加/删除/替换事件。我注意到我忘记了上面的
JsonParser
示例;显然需要让生成器知道从哪里获取输入。我很困惑。这会把它复制到发电机上吗?什么是活动?我也有类似的问题,需要修改json字符串,但我无法从您的回答中看出这一点。这是针对Jackson Streaming API的,其中
JsonParser
用于将json作为事件序列读取(
JsonToken
);和
JsonGenerator
将JSON内容编写为类似事件。您可以简单地将解析器连接到生成器,让它在大部分时间内复制事件;除了要修改的添加/删除/替换事件。我注意到我忘记了上面的
JsonParser
示例;显然需要让g