2016-04-18 13 views
0

ファイルはjsonの約70GBなので、GsonストリーミングAPIを使用してWikidata JSON dumpを解析しようとしています。次のようにファイルの全体的な構造は以下の通りである:JSONフィールドの値に応じてさまざまな種類のオブジェクトを持つGsonストリーミングAPI

[ 
{"type":"item",... other fields ...}, 
{"type":"property",... other fields ...}, 
..... 
] 

それは各オブジェクトタイプitem又はpropertyとすることができると私は別のクラスをインスタンス化したいと考えているオブジェクトの配列である(すなわち、Iは、該当する項目が私のJavaコードのPropertyクラス)を、私が遭遇するオブジェクトに応じて選択します。

基本的には、typeフィールドを見て、それに応じて次のJSONを解析したいと考えています。 JsonReaderはgetNextJsonObject()または同様の機能を提供していないようですので、ファイル全体を前処理して別のものに分割する以外にもこれを行う方法はありますか?このファイルは非常に大きいので、私はその場ですべてを行うことができる余分な前処理ステップを避けたいと思っています。

+0

次は何が起こるのかを示すpeek()にアクセスする必要があります。 – Savior

+0

'peek()'を行う方法は見つけられませんでした。なぜなら、 'type'フィールドを見つけてその時点で私はすでにJSONオブジェクトの中に入っていて、戻ることができないからです。 –

+0

Canあなたが '型式 'を見てしまうまで何かをインスタンス化するのをやめていますか? – Savior

答えて

0

私は実際に思考の少し後に非常に簡単な解決策を見つけました。

Gson.fromJson(JsonReader reader, Class class) 

これは、読者から次のオブジェクトを読んで、あなたは、パラメータとして渡すクラスにデシリアライズされます:GsonのAPIは、メソッドを提供します。私のケースでは、どのクラスをシリアライズするのかわからないので、次のようにすることができます。

JsonObject asd = gson.fromJson(reader, JsonObject.class); 
if (asd.get("type").getAsString().equals("item")) { 
    // Instantiate item 
} else { 
    // Instantiate property 
} 
関連する問題