0

ディスク上に非常に大きな .json ファイルがあります。Jackson パーサーを使用して、これを Java オブジェクトとしてインスタンス化したいと考えています。

ファイルは次のようになります。

[ { "prop1": "some_value",
    "prop2": "some_other_value",
    "something_random": [
      // ... arbitrary list of objects containing key/value 
      //     pairs of differing amounts and types ...
    ]
  },
  // ... repated many times ...
  {
  }
]

基本的に、これはオブジェクトの大きな配列であり、各オブジェクトにはそれを識別する 2 つの文字列プロパティがあり、次にオブジェクトの別の内部配列があり、各オブジェクトはプロパティと値のランダムなコレクションであり、ほとんどが文字列と int ですが、配列も含まれる場合があります。

このオブジェクト レイアウトのため、これらのオブジェクトを簡単にインスタンス化するために使用できるセット スキーマはありません。org.json プロセッサを使用するには、ファイル全体に文字列を割り当てようとする必要がありますが、サイズが原因で失敗することがよくあります。そこでストリーミングパーサーを使いたいのですが、まったくなじみがありません。

最後に必要なのは、String が prop1 の値で、SomeObject がオブジェクト全体のデータを保持するもの (最上位の配列エントリ) である Map です。おそらく、後で必要になったときに解析できる JSON だけでしょうか?

とにかく、このためのコードを書く方法についてのアイデアは大歓迎です。

4

1 に答える 1

3

全体を単一のオブジェクトとしてバインドしたくないため、おそらくreadValues()のメソッドを使用する必要がありObjectReaderます。また、個々の値の構造が一種の一般的なものである場合は、それらをjava.util.Maps またはJsonNodes (Jackson のツリー モデル) としてバインドすることができます。したがって、次のようにします。

ObjectMapper mapper = new ObjectMapper();
ObjectReader reader = mapper.reader(Map.class); // or JsonNode.class
MappingIterator<Map> it = reader.readValues(new File("stuff.json"));
while (it.hasNextValue()) {
   Map m = it.nextValue();
   // do something; like determine real type to use and:
   OtherType value = mapper.convertValue(OtherType.class);
}

全体を反復します。

于 2012-06-10T01:56:02.983 に答える