【问题标题】:Android: Stream a large JSON Array produced from loopj's AsyncHttpClientAndroid:流式传输从 loopj 的 AsyncHttpClient 生成的大型 JSON 数组
【发布时间】:2015-08-31 10:28:56
【问题描述】:

这是我的第一个问题,希望我没有弄错..

我从 'onSuccess()' 的返回值中得到了一个讨厌的长 json 数组,格式如下:

[
    {
     "label1":"value1",
     "label2":"value2",
     "label3":"value3",
     ....
    },
    {
     "label1":"value1",
     "label2":"value2",
     "label3":"value3",
     ....
    },
    ....
]

当我尝试将其转换为字符串并使用杰克逊常用的“映射器”对其进行解析时,我得到了可怕的内存不足异常。这让我觉得我需要流式传输这个大 json。

我去了jackson提供的here的例子,但是这个例子似乎对我帮助不大

我想知道我是否无法搜索,或者我只是一个编程方面的笨蛋,但如果有人能指导我举一个很好的例子,那将是非常高兴的。

我目前的努力:

client.get(
     get_all_item_url,
     new JsonHttpResponseHandler() {
       @Override
       public void onFailure(int statusCode, Header[] headers, String responseBody, Throwable e) {
                        ....
                        }


      @Override
      public void onSuccess(JSONArray response) {
           ObjectMapper mapper = new ObjectMapper();
           ProductModel[] productModels = null;
           try {
               productModels = mapper.readValue(response.toString(),TypeFactory.defaultInstance().constructArrayType(ProductModel.class));
               } catch (IOException e) {
                    e.printStackTrace();
               }
           ....
      }
});

【问题讨论】:

  • 您是否尝试在本地保存 JSON 只是为了看看它有多大?
  • 2MB。大约值 3000 条记录...
  • 如果您设计了它,请先尝试减少该响应
  • 恐怕我不能减少响应,因为那是另一个人设计的。
  • 您可以使用哪些参数呢?返回 2 MB 的 json 没有意义……但如果您没有其他方法,请考虑将“响应流”保存到文件中,然后处理该文件。

标签: java android json jackson loopj


【解决方案1】:

您应该避免拨打response.toString()。您可以从数组中获取一个元素并对其进行解析。它不是真正的流式传输,但它显着减少了内存消耗。

【讨论】:

  • 我想我现在会尝试这个作为一种解决方法,因为 JSON 并不那么复杂。
【解决方案2】:

对于大型 JSON 响应,您必须使用流技术。它会一一解析 JSON 数据:

阅读本文了解详情:

http://www.mkyong.com/java/jackson-streaming-api-to-read-and-write-json/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    • 2015-12-02
    • 2022-08-10
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 2021-07-17
    相关资源
    最近更新 更多