解析大型 JSON 响应时出现 OutOfMemoryException

2023-12-28

我正在做一个项目,我需要通过以下方式从 URL 解析 JSONHttpClient。我的代码适用于具有少量数据的 JSON 对象响应。但是当我使用相同的代码获得大量数据(超过 3MB)的响应时,我遇到了问题。

这是我的代码:

JSONfunctions.java(json解析的函数)

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
//import java.util.HashMap;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
//import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
//import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.util.Log;
import android.widget.Toast;

@SuppressWarnings("unused")
public class JSONfunctions {

    public static JSONObject getJSONfromURL(String url){
        InputStream is = null;
        String result = "";
        JSONObject jArray = null;

        //http post
        try{
                HttpClient httpclient = new DefaultHttpClient();
                HttpPost httppost = new HttpPost(url);
                HttpResponse response = httpclient.execute(httppost);
                HttpEntity entity = response.getEntity();
                is = entity.getContent();

        }catch(Exception e){
                Log.e("log_tag", "Error in http connection "+e.toString());
        }

        //convert response to string
        try{
                BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
                StringBuilder sb = new StringBuilder();
                String line = null;
                while ((line = reader.readLine()) != null) {
                        sb.append(line + "\n");
                }
                is.close();
                result=sb.toString();

            //    Toast.makeText(getBaseContext, result, Toast.LENGTH_LONG).

        }catch(Exception e){
                Log.e("log_tag", "Error converting result "+e.toString());
        }

        try{

            jArray = new JSONObject(result);            
        }catch(JSONException e){
                Log.e("log_tag", "Error parsing data "+e.toString());
        }

        return jArray;
    }
}

ListJson.java

import java.util.ArrayList;
import java.util.HashMap;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
//import org.w3c.dom.Document;
//import org.w3c.dom.Element;
//import org.w3c.dom.NodeList;



import android.app.ListActivity;
import android.content.Intent;
//import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;


public class ListJson extends ListActivity {
     public static JSONObject json;
     public static JSONArray data;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.list1);

        ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();
     //   String semail = "[email protected] /cdn-cgi/l/email-protection";
      //  String spassword = "partha123";


      //  Toast.makeText(getApplicationContext(), JSONExample2.strEmail, Toast.LENGTH_LONG).show();
        //Toast.makeText(getApplicationContext(), JSONExample2.strPwd, Toast.LENGTH_LONG).show();

        //    

        json = JSONfunctions.getJSONfromURL("url here");      


            try{

            data = json.getJSONArray("server_list");


            for(int i=0;i<data.length();i++){                       
                HashMap<String, String> map = new HashMap<String, String>();    
                JSONObject e = data.getJSONObject(i);

                map.put("id", String.valueOf(i));
                map.put("name", "" + e.getString("ServUser"));
                map.put("email", "" + e.getString("ServURL"));
                mylist.add(map);
            }       
        }catch(JSONException e)        {
             Log.e("log_tag", "Error parsing data "+e.toString());
        }


//        try {
//          JSONObject newObject=json.getJSONObject("subscription");
//          JSONArray data1 = newObject.getJSONArray("cust_product");
//          
//          Toast.makeText(getApplicationContext(), data1.toString(), Toast.LENGTH_LONG).show();
//         
//          for(int i=0;i<data1.length();i++){                      
//                  HashMap<String, String> map1 = new HashMap<String, String>();   
//                  JSONObject e = data.getJSONObject(i);
//                  
//                  map1.put("id", String.valueOf(i));
//                  map1.put("name", "" + e.getString("ServUser"));
//                  map1.put("email", "" + e.getString("ServURL"));
//                  mylist.add(map1);
//              }       
//          
//      } catch (JSONException e) {
//          // TODO Auto-generated catch block
//          e.printStackTrace();
//      }


         ListAdapter adapter = new SimpleAdapter(this, mylist , R.layout.item_list,
                                  new String[] { "name", "email" }, 
                              new int[] { R.id.item_title, R.id.item_subtitle });
                                  setListAdapter(adapter);


      final ListView lv = getListView();
       lv.setTextFilterEnabled(true);   
        lv.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {              
                //@SuppressWarnings("unchecked")
                //HashMap<String, String> o = (HashMap<String, String>) lv.getItemAtPosition(position);                 
            //  Toast.makeText(ListJson.this, "ID '" + o.get("id") + "' was clicked.", Toast.LENGTH_SHORT).show(); 

                Toast.makeText(getApplicationContext(), parent.getItemAtPosition(position).toString(),
                        Toast.LENGTH_LONG).show();

            //   String a= parent.getItemAtPosition(position).toString();

                Intent intent2= new Intent(ListJson.this, ListJson2.class);
                 startActivity(intent2);
            }
        }); 

    }

我正在得到一个OutOfMemoryException。我将 heap_size 更改为 192MB,将 ram 大小更改为 32MB,但没有成功。我怎样才能解决这个问题?


大量的 JSON 数据必须被切割成更小的部分。例如,您的数据库中有 50000 个产品。那么明智的做法是对 API 请求进行分页 - 通过一次查询获取 100-500 条记录来获取如此大量的产品。那会解决你的问题。

这种方法又解决了一个问题 - 由于互联网和 gprs 连接丢失等引起的错误。

如果 API 是您的,那么您可以更改此设置。如果不是,那么这是 API 设计的一大失败,您可以发送更改请求。

EDIT:

稍微阅读了一下,发现强烈推荐解析大量 JSON 数据:http://jackson.codehaus.org/ http://jackson.codehaus.org/(杰克逊处理器)。还没有尝试过,所以无法评论这个库。还建议您将此 JSON 流保存到文件中(不要将其加载到内存中),然后按块解析它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解析大型 JSON 响应时出现 OutOfMemoryException 的相关文章

随机推荐

  • 创建 Windows 服务的最简单语言

    构建 Windows 服务最简单的语言是什么 在这种情况下 最简单的定义是最少的代码量和最低的语言入口点 冒着陈述显而易见的风险 如果您有任何 C C Java 背景 我认为 C 为您提供了最低的切入点 假设您使用的是 Visual Stu
  • 在构造函数中注册weak_ptr观察者

    我正在尝试重写我们的 Observer Observable 实现 以使用 std shared ptr std weak ptr 来消除代码中当前存在的一些令人讨厌的竞争条件 通常 观察者在满足某些条件或构造子对象时注册自己 如下所示 U
  • 从给定字符串中查找按字母顺序排列的最长子字符串

    我一直在研究一个问题 从给定的字符串中按字母顺序查找最长的子字符串 我在 C 方面有很多经验 但对 python 完全陌生 我写了这段代码 s raw input Enter a sentence a 0 start int b 0 end
  • 使用 jquery/ajax 更新 django 表单

    我想更新下拉列表的更改事件的表单 这是我的观点 from django utils import simplejson response dic drop down list actToValidateId add form cleaned
  • Symfony2 QueryBuilder 中带有计数和分组依据的 SQL 查询

    我需要你的帮助 我有这个 SQL 查询 SELECT COUNT AS count FROM mytable GROUP BY email ORDER BY id DESC LIMIT 0 30 但我想在 Symfony2 中使用 Doct
  • Dagger 2:如何注入Map, Provider>

    在 Dagger 2 中 是否可以注入Map
  • Jenkins 中的多个构建队列

    我在 Jenkins 中有许多不同的工作 分为具有自己的构建 测试 分析 管道 的项目 大多数这些工作实际上是远程命令而不是机上构建 然而 开箱即用的 Jenkins 仅支持一个队列all构建 我想为每个项目 或视图 定义一个队列 我将如何
  • 手势监听器 onFling 的行为不一致

    更新 请参阅赏金以了解扩展问题 我有一个GestureDetector设置在ListView ListView 是一个完整的片段 来自窗口的一侧并部分覆盖另一个片段 我想让用户能够将其关闭 即奇妙清单是右侧此功能的一个很好的例子 这是我的设
  • Android Studio 3.0 中的资源 ID 未更新

    我最近更新到 Android Studio 3 0 并注意到当我添加任何 android id 或创建新的可绘制对象或基本上任何资源时 Android Studio 不会在项目中更新它 直到我构建应用程序 我在 xml 中创建的每个资源在类
  • 使用 SetWindowPos 更改窗口左边缘时减少闪烁

    更新1 这是简化版本 所以我有一个特殊的固定大小的子窗口 我想制作它留在右侧可调整大小的主窗口 当用户通过拖动主窗口的左 右边缘来调整主窗口的大小时 会发送 WM WINDOWPOSCHANGED 子窗口将在此消息处理程序中移动 使其 粘
  • 使用 IMAP4 和 python 从 GMail 获取加星标的邮件

    我发现了许多有关使用 IMAP 的虚拟信息 但我不明白如何将其用于我的目的 我找到了如何从邮箱中获取所有邮件和所有已看到的邮件 但是我应该如何使用星星 请给我一个 python 代码示例 用于通过 IMAP4 从 GMail 获取加星标的邮
  • 导入错误:没有名为 win32service 的模块

    我在 eclipse IDE 上使用 odoo8 和 python 2 7 9 64 位 Python 软件损坏了 所以我不得不重新安装它 现在我面临这个新问题ImportError No module named win32service
  • 角度中的 jQuery.when() 相当于什么

    在 jQuery 中我们可以做 when ajax page1 php ajax page2 php done function a1 a2 角度相当于什么 我真的需要等待所有 ajax 调用完成然后再做一些事情 谢谢 您可以使用 q al
  • 在 iframe 内触发按钮单击[重复]

    这个问题在这里已经有答案了 这是 iframe 代码 div class outerdiv div 以下是上面的 iframe 调用的按钮的 HTMl 代码
  • 阻塞信号也是待处理信号吗?

    我们知道应用程序可以使用以下命令明确阻止和解除阻止选定的信号sigprocmask函数 假设我们使用这个函数来阻止SIGINT 因此内核设置阻塞向量中的相应位 如果我们运行程序并按 Ctrl C 发送SIGINT 由于该信号当前被阻止 因此
  • 为什么 -[UISectionRowData refreshWithSection:tableView:tableViewRowData:] 断言失败?

    Assertion failure in UISectionRowData refreshWithSection tableView tableViewRowData SourceCache UIKit UIKit 2380 17 UITa
  • 如何使用CSS创建毛玻璃效果?

    我想创建一个div固定在一个位置并使其半透明 使其后面的内容部分可见且模糊 我正在寻找的风格类似于div中的 查看全部 缩略图苹果网站 http www apple com 我唯一能做的就是调整opacity 0 9但我不能模糊下面的内容d
  • R CRAN 检查中的注释 ---没有存储库设置,因此跳过了循环依赖检查[重复]

    这个问题在这里已经有答案了 我读过了R CRAN 检查中的注释 没有设置存储库 因此跳过了循环依赖检查 https stackoverflow com questions 23164929 note in r cran check no r
  • 调试器代理未启用

    我正在使用 Ripple 调试 Cordova TypeScript 项目 当我调试 调试 gt Android gt Ripple 时 调试输出窗口不显示调试消息 相反 我收到以下消息 code 32000 message Debugge
  • 解析大型 JSON 响应时出现 OutOfMemoryException

    我正在做一个项目 我需要通过以下方式从 URL 解析 JSONHttpClient 我的代码适用于具有少量数据的 JSON 对象响应 但是当我使用相同的代码获得大量数据 超过 3MB 的响应时 我遇到了问题 这是我的代码 JSONfunct