次のような配列を提供する外部サービスにアプリを接続しようとしています
[{"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終了