我尝试将应用程序连接到外部服务,该服务为我提供了一个类似的数组
[{"descr":"my description","id":"123"},...]
或者在出现错误的情况下
{"error":{"code":123,"message":"my message"}}
有没有办法将其定义为单个类或识别流是哪个对象?
更新 1:我已经通过在循环中运行 100 次并计算平均执行时间来测试多个版本。在所有不同的版本中,我都使用了杰克逊。
这是性能的基线。它不能满足业务需求,因为代码没有区分数组和对象。
fcPhotos = mJsonToObjectMapper.readValue(mFcHttpHelper.doGet(urlString), FcPhotos.class);
照片:平均 100 次处决。持续时间:923ms
使用解析器会使性能降低大约 min。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