2

既存の JSON ファイルの値を 1 つだけ編集したい。

ファイル全体を解析して再書き込みせずにそれを行う方法はありますか? (Jackson Streaming API を使用してファイルを生成および解析しますが、ストリーミング API でそれができるかどうかはわかりません)。

私のExample.jsonファイルには次のものが含まれています。

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

例:「name」の値を「Example」から「other name」に編集したい。

4

2 に答える 2

0

私が知っていることではありません。JSON レベルまたはファイル レベルで - 値の長さがまったく同じでない限り、基本的なファイル システムでは、通常、ファイルの残りの部分を変更点から書き換える必要があります。

ストリーミング 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 に答える