获得aarray列表或类

时间:2011-02-10 01:00:34

标签: json jackson

我尝试将应用程序连接到外部服务,该服务为我提供了类似

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

或出现类似

的错误
{"error":{"code":123,"message":"my message"}}

有没有办法将它定义为单个类或识别哪个对象的流?

<小时/> 更新1:我通过在循环中运行100次并计算平均执行时间来测试多个版本。在所有不同版本中我都使用过杰克逊。


这是性能的基线。它不符合业务要求,因为代码不区分数组和对象。

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

照片:平均100次执行持续时间:923ms

<小时/> 使用解析器会将性能降低约几分钟。 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


1 个答案:

答案 0 :(得分:1)

一种可能性是使用JsonParser查看第一个令牌(JsonToken.START_ARRAY或JsonToken.START_OBJECT),然后进行数据绑定。 ObjectMapper可以将JsonParser指向第一个事件,或者尚未移动到第一个事件。在处理根级JSON值流时,JsonParser / ObjectMapper的组合也很好(就像map / reduce样式流或使用JSON时的日志条目一样)。

另一种方法是首先绑定到树模型(JsonNode; ObjectMapper.readTree());查看node是否为ObjectNode或ArrayNode,然后使用ObjectMapper.convertValue(rootNode,desiredClass)。这样做的好处是,如果没有数组与对象的区别,您还可以检查树的属性。