9

答えはこれと重複しているのではないかと思います。Jackson-JsonからPOJOへの複数のエントリがありますが、質問は十分に異なる可能性があると思います。また、完全なデータバインディングではなく、生データバインディングを使用しています。

その質問の質問者のように、ファイルに複数のオブジェクトがあり、それらをPOJOに変換して、設計のデータベースに詰め込み、データにゆっくりではなくすばやくアクセスできるようにしようとしています。

ここでのファイルは数十GBのオーダーであり、各ファイルには最大数百万のオブジェクトが含まれています。とにかくここに私がこれまでに持っているものがあります:

ObjectMapper mapper = new ObjectMapper();
Map<String,Object> data = mapper.readValue(new File("foo.json"), Map.class);
System.out.println(data.get("bar"));

これは、fooの最初のオブジェクトのbar要素を印刷するのに最適ですが、すべてのメモリを消費しない方法ですべての要素を反復処理する方法が必要です。

ありがとう。

4

3 に答える 3

12

ストリーミング ( JsonParser) とObjectMapperのどちらかを選択する必要はありません。両方を実行してください。パーサーで少しトラバースしますが、JsonParser.readValueAs(MyType.class)個々の JSON オブジェクトをバインドするために呼び出します。

または、適切なポイントで JsonParser を渡すObjectMapperのメソッドを呼び出します。readValue()またはObjectMapper.reader(Type.class).readValues()、そのように使用して繰り返します。

于 2012-05-02T23:58:03.120 に答える
8

このコード サンプルを使用して、基本的な考え方を確認してください。

final InputStream in = new FileInputStream("json.json");
try {
  for (Iterator it = new ObjectMapper().readValues(
      new JsonFactory().createJsonParser(in), Map.class); it.hasNext();)
    System.out.println(it.next());
}
finally { in.close();} }
于 2012-05-02T09:47:42.323 に答える
1

オブジェクトをラップする配列があると仮定して、JsonParser を作成readValuesAsし、適切な型で呼び出します。Iteratorオブジェクトを消費するときにファイルを読み取るすべてのオブジェクトを返します。

于 2012-05-03T01:18:12.097 に答える