0

私は、Json をファイルまたは URL から jsonarray および jsonobjects に解析する Android アプリケーションを作成しています。問題は、私の json が 3.3 mb であり、単純なコードを使用すると、次のようなものになることです (作業中のため、実際のコードにアクセスできず、チュートリアルからコードをコピーしたため、エラーが発生する可能性があります)

(すでに入力ストリームのコンテンツがあると仮定します)

InputStream content = entity.getContent();
                BufferedReader reader = new BufferedReader(new InputStreamReader(content));
                String line;
                while ((line = reader.readLine()) != null) {
                    builder.append(line);
String twitterfeed = builder.toString();
}

JSONArray jsonArray = new JSONArray(twittefeed);
            Log.i(ParseJSON.class.getName(),
                    "Number of entries " + jsonArray.length());
            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                Log.i(ParseJSON.class.getName(), jsonObject.getString("text"));

Android デバイスでこのコードを実行すると、文字列を jsonArray に解析するときに OutOfMemory エラーが発生します。合計文字列が 17 mb (3.3 mb の json ファイル?!) であることがわかったいくつかのことをログに記録しました。twitterfeed などの小さな json ファイルを使用すると、コードは正常に動作します。この 17 MB の文字列をメモリに格納すると、メモリが不足するため、json を解析できません。

多くの調査の後、入力ストリームを解析できることがわかったので、ジャクソンが私の解決策である可能性があることがわかりました。これは役立つはずです。メモリに 17 MB の文字列は必要ないからです。これは私が推測する最も効率的な方法ではありません....しかし、これが本当にうまくいくかどうかはわかりません。これが実際に機能することを知っている人はいますか?チュートリアルはどこにありますか?

「createJsonParser -- public JsonParser createJsonParser(InputStream in)」を見つけて、これが私のやり方だと思います...しかし、コードにこれを実装する方法がわからず、例が見つかりません。これがどのように機能するか知っている人はいますか?

4

2 に答える 2

7

gsonまたはjacksonのいずれかでjsonストリーミングを使用する必要があります。ジャクソンを使用すると、ハイブリッドアプローチも使用できます。これにより、解析されるjsonの一部のみがメモリに読み込まれるため、メモリ消費量が大幅に削減されます。

https://sites.google.com/site/gson/gson-user-guide http://jackson.codehaus.org/

ジャクソンの例http://www.mkyong.com/java/jackson-streaming-api-to-read-and-write-json/

于 2012-06-19T18:08:58.020 に答える
0

Jackson を使用したハイブリッド ストリーミング アプローチは、適切なオプションです。そうすれば、未加工の JSON 入力を介してポインターを進めることができ (その都度検証します)、処理が必要な入力チャンクを検出すると、それをツリー階層に読み取って任意のデータを引き出すことができます。そこから必要なデータ。

于 2014-01-05T19:42:21.430 に答える