1

JSON を扱うために、Java で Jackson API を使用しています。私はあちこちでそれを少し扱っ​​てきましたが、あまり深くはありません。

現在、POJO のリストから作成された JSON オブジェクトの配列 (ストリームまたは文字列を介して) を取得し、POJO を追加または削除する良い方法を探しています。追加の場合、重複チェックは実際には必要ありません。簡単な例として、「field」という名前の単一の変数を持つ Java オブジェクトのリストからこの配列を作成したとします。

[{"field":"value"},{"field":"value2"}]

そして、「フィールド」が「値3」に設定された同じタイプのオブジェクトを追加したいと思います。単純に配列全体を Java オブジェクトのリストにデシリアライズし、新しいオブジェクトを追加して、それをシリアライズして JSON に戻すこともできますが、それはやり過ぎのように感じます。Jackson を使用して単純に新しいオブジェクトをシリアル化し、それを JSON 配列の末尾に追加できればもっとよいでしょう。同じことが、配列から既存のオブジェクトを削除する場合にも当てはまります。

4

1 に答える 1

1

私は方法を見つけましたが、奇妙なことに、それぞれ 3 つのフィールドを持つ 500 個の POJO のリストを使用した直接の deserialize-add-reserialze メソッドよりも 2 倍以上遅く、オブジェクトが増えると悪化するだけです。

ObjectMapper mapper = new ObjectMapper();
JsonParser parser = mapper.getJsonFactory().createJsonParser(input);
JsonGenerator gen = mapper.getJsonFactory().createJsonGenerator(output, JsonEncoding.UTF8);
gen.writeStartArray();
parser.nextToken();
while (parser.nextToken() == JsonToken.START_OBJECT) {
    //gen.writeTree(parser.readValueAsTree());
    //parser.skipChildren();
    //EDIT: This is much faster as the only method in the loop:
    gen.copyCurrentStructure(parser);
}
gen.writeTree(mapper.valueToTree(/*new Object to add*/);
gen.writeEndArray();
gen.close();
parser.close();

各オブジェクトをツリーとして取得せず、代わりにフィールド/値として繰り返し移動しても、少し速くなりますが、代替方法よりもかなり遅くなります。これは予想されることですか、それとも大量の JSON-to-Java-to-JSON メソッドではなく、ストリーミング データとして処理するためのより良い方法はありますか?

編集:ああ!JsonGenerator が JsonParser から現在の構造を直接コピーできることがわかりましたcopyCurrentStructure(JsonParser)。while ループでこれを使用すると高速になり、ブルートフォース メソッドよりも大幅に高速化されます。

于 2014-10-10T17:22:50.947 に答える