2012-04-21 2 views
1

既存のJSONファイルで1つの値しか編集しません。既存のJSONファイルの値をすべて解析せずに値を編集するにはどうすればいいですか?

ファイル全体を解析して書き直すことなくこれを行う方法はありますか? (私は、ファイルを生成して解析するためにJackson Streaming APIを使用しますが、Streaming APIがそれを行うことはできません)。

Example.jsonファイルには、次のものが含まれています。与えられた

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

例:私は「他の名前」に「例」から「名前」の値を編集したいです。

答えて

0

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

ストリーミングAPIを使用してファイルを読み書きすることができます。タスクを簡略化するためにJsonGenerator.copyCurrentEvent(jp)を参照してください。入力イベントをそのままそのままコピーします。特定の値を置き換える以外はすべて、あなたはそれを呼び出すことができます。値の場合はJsonGenerator.writeString()に電話することができます。

+0

ありがとうございました –

+0

私は混乱しています。それはジェネレータにコピーされますか?イベントとは何ですか?私も同様の問題があり、jsonの文字列を変更する必要がありますが、私はあなたの答えからこれを理解することはできません。 – simgineer

+0

これは、JSONを一連のイベント( 'JsonToken')として読み込むために' JsonParser'が使用されるJackson Streaming API用です。同様のイベントとしてJSONコンテンツを書き込むための 'JsonGenerator'もあります。パーサをジェネレータに接続して、ほとんどの場合イベントをコピーさせることができます。変更したいイベントを追加/削除/置き換えます。 私は上記の 'JsonParser'の例を忘れていたことに気付きました。その入力を得る場所を発電機に知らせることは明らかに必要です。 – StaxMan

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ファイルを使って何をしているのですか?分割してください!しかし、引数のために...

あなたは本当にそれをやりたがっているので、ファイル内のバイトオフセットを追跡し、それをJsonNodeを表すオブジェクトに結びつけるためにJSONパーサにフックします操作されます。この時点であなた自身のパーサを書くことになるかもしれません。 JSON文法は意図的に簡単です。その後、ファイルを開いて、そのオフセットにスキップし、JsonNodeデータを書き込んでいます...それが後に何かを上書きしない限り(ちょうどすべての値の後にスペースのバッファをあらかじめファイルに入れていますか? ...これはデータベースの問題のように聞こえ始めています)。その場合、ファイルの残りの部分全体を書き直すことになります。大きな値は、他のすべてを下に「プッシュ」するからです。編集が常にファイルの終わり近くにある場合、大したことではありません。しかし、それらがランダムであれば、あなたのパフォーマンスは破滅します。書き込みの直列化のボトルネックになります。

関連する問題