1

次のような配列を提供する外部サービスにアプリを接続しようとしています

[{"descr":"my description","id":"123"},...] 

または次のようなエラーが発生した場合

{"error":{"code":123,"message":"my message"}}

これを単一のクラスとして定義する方法、またはオブジェクトがどのストリームであるかを認識する方法はありますか?


更新 1: ループで 100 回実行し、平均実行時間を計算して、いくつかのバージョンをテストしました。すべての異なるバージョンで、jackson を使用しました。


これがパフォーマンスのベースラインです。コードは配列とオブジェクトを区別しないため、ビジネス要件を満たしていません。

fcPhotos = mJsonToObjectMapper.readValue(mFcHttpHelper.doGet(urlString), FcPhotos.class);

写真: 平均 100 回の実行。持続時間: 923ms


パーサーを使用すると、パフォーマンスが約 1 分低下します。50%

JsonParser jsonParser = mJsonFactory.createJsonParser(mFcHttpHelper.doGet(urlString));

if (jsonParser.nextToken() == JsonToken.START_ARRAY) {
   fcPhotos = mJsonToObjectMapper.readValue(jsonParser, FcPhotos.class);
}

写真: 平均 100 回の実行。継続時間: 1585ms


InputStream を String に変換し、objectMapper.readValue ソリューションを保持すると、次のようになります。

jsonString = inputStreamToString(urlString);
fcPhotos = mJsonToObjectMapper.readValue(jsonString, FcPhotos.class);

private final String inputStreamToString(final String urlString) throws UnsupportedEncodingException, IOException {
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(mFcHttpHelper.doGet(urlString), "UTF8"), 8192);
    StringBuilder stringBuilder = new StringBuilder();
    String line = null;

    while ((line = bufferedReader.readLine()) != null) {
        stringBuilder.append(line + "\n");
    }

    bufferedReader.close();
    return stringBuilder.toString();
}

写真: 平均 100 回の実行。継続時間: 1191ms


アップデート1終了


4

1 に答える 1

1

1 つの可能性は、JsonParser を使用して最初のトークン (JsonToken.START_ARRAY または JsonToken.START_OBJECT) を確認し、データ バインディングを行うことです。ObjectMapper は、最初のイベントを指すか、まだ最初のイベントに移動していない JsonParser を受け取ることができます。JsonParser/ObjectMapper の組み合わせは、ルートレベルの JSON 値のストリームを処理する場合にも適しています (マップ/リデュース スタイル ストリームの場合や、JSON を使用する場合のログ エントリの場合など)。

もう 1 つの方法は、最初にツリー モデル (JsonNode; ObjectMapper.readTree()); にバインドすることです。node が ObjectNode または ArrayNode であるかどうかを確認してから、ObjectMapper.convertValue(rootNode, desiredClass) を使用します。これには、配列とオブジェクトの区別がない場合に、ツリーのプロパティもチェックできるという利点があります。

于 2011-02-10T05:38:00.987 に答える