处理大量 HTTP JSON 响应的最佳方法

2024-06-23

解析来自服务器的 JSON 回复(以 1 个大行返回)的最有效方法是什么? 我不想/不需要将此 JSON“映射”到某些自定义/业务对象,因为我只需要结构的特定部分。
主要是在一组数组中查找特定的标签及其值。

UPDATE:

我正在寻找一种有效的方法来解析来自内部服务器的 JSON 响应。
响应作为一个巨大的单行发送。该文件太大了,尝试使用浏览器的 json 插件来理解结构仍然很困难,因为浏览器被“卡住”了。
出于我的需要,我想要特定的信息位,并且不想将 JSON 映射到实际的业务对象/类,因为这将是太多不必要的工作。 我目前正在做的测试(为了清楚起见,我删除了异常处理):

HttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
HttpResponse response = null;
response = client.execute(httpGet);
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
StringBuilder builder = null;
if (statusCode == 200) {
          HttpEntity entity = response.getEntity();
          InputStream content = entity.getContent();
          builder = new StringBuilder();
          BufferedReader reader = new BufferedReader(new InputStreamReader(content));
          String line;
          while ((line = reader.readLine()) != null) {
                    builder.append(line);
          }
          if ( builder.length() != 0 ) {
                processJSON(builder.toString());
          }
           return builder.toString();
}

private void processJSON(String s) {
        JSONObject o = new JSONObject(s);
        String url = (String) o.get("url");

       JSONArray array = o.getJSONArray("individualroles");

       for( int i = 0; i < array.length(); i++ ) {
                JSONObject elem = (JSONObject) array.get(i);
                String fullNameForDisplay = (String) elem.get("fullName");
                String status =  (String) elem.get("status");
                String date = (String) elem.get("date");
                String fullDescription = (String) elem.get("full_description").toString();
                JSONArray contacts = (JSONArray) elem.get("contacts");
                for(int j = 0; j < contacts.length(); j ++ ) {
                    JSONObject contact = (JSONObject) contacts.get(j);
                    String contactName = contact.getString("contactName");
                    String displayName = contact.getString("displayName");
                    String realAddress = contact.getString("realAddress");

                    Log.i(“MyApp”, “contactName = “ + contactName + “ displayName = “ + displayName + “ readAddress  = “ + realAddress);
                }
         }

这实际上将日志弄乱为 JSON 响应,即String s长度约为 700 万个字符。
我还在日志中看到许多语句,例如:

I/art:后台粘性并发标记清除GC释放了389(14KB)个AllocSpace对象,3(851KB)个LOS对象,0%空闲,2MB/2MB,暂停30.651ms总共77.127ms

为了测试这一点,我所做的是在片段中onCreate I do:

 Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                Log.i(“MyApp”, (new JSONParser().get(JSON_URL_SERVER)));
               }
        });
        thread.start();

是否有任何问题,例如内存和GC用这种方法吗?我该如何改进这个?


您应该使用在读取期间解析输入流的东西。

与 XML 的 SAX 解析器类似,JSON 也有这样的实现。杰克逊就是其中之一,还有其他人json-简单 https://code.google.com/p/json-simple/有一个非常简单的方法,在这里解释 https://code.google.com/p/json-simple/wiki/DecodingExamples#Example_5_-_Stoppable_SAX-like_content_handler.

如果我理解你的代码正确的话,你主要是在寻找 key 下的所有内容"individualroles"。因此,使用这个类似 SAX 的解析器,您可以实现ContentFinderKeyFinder在示例中,一旦输入流中达到所需的键,解析器就会调用它。现在您可以处理 JSON 的该部分,然后可以一起结束解析/读取。

很抱歉,我无法提供更详细的解释,但我自己没有使用过该特定库,它只是我可以提供的映射到 JSON 的 SAX 解析器的知识。

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

处理大量 HTTP JSON 响应的最佳方法 的相关文章

随机推荐

  • 使用 Python 的 Popen 替换 Bash 风格的进程

    在 Bash 中 您可以轻松地将进程的输出重定向到临时文件描述符 并且所有这些都由 bash 自动处理 如下所示 mydaemon config file lt echo autostart True n daemonize True 或者
  • 尝试删除时 SQL 异常错误 #547 和外键约束违规

    我正在查看一些代码 我没有编写它 来测试我们的代码在尝试删除存在依赖项的表行时是否捕获两个错误条件 该代码最初查找消息中的特定文本 而不是使用错误号 为了提供多语言支持 最好根据错误号而不是错误消息来捕获异常 在测试中 代码正在查找两组文本
  • 变量在事实之前发生了变化,您能解释一下 Chrome V8 的这种行为吗?

    我正在编写一个 javascript 程序并在 Chrome 7 中运行它 当时我遇到了一些奇怪的行为 现在 在我的代码中 随着所有其他事情的发生 我花了一些时间才弄清楚那不是我 我已经提取了下面代码的精华
  • 列名不明确错误

    我在从 2 个表中选择命令时遇到问题 所以我有表1 table1 id int pk table1 name table1 surname table1 age table1 address table1 city 和表2 table2 i
  • SVG 模式在 Safari 中不起作用

    我正在尝试使用 SVG 制作类似网格的图案 我看到非常奇怪的行为
  • :before 带有属性选择器

    我有以下 html 表单 div p Field1 p div
  • 启动 CSS 动画 JavaScript

    如何用js启动CSS动画 第一行 webkitAnimation 有效 但其他行无效 anim logo style webkitAnimation threesixty 3s anim logo style mozAnimation th
  • 使用 pySpark 在 Azure Databricks 中使用来自 EventHub 的事件

    我可以看到 Spark 连接器和使用 Azure Databricks 中的 Scala 从事件中心消费事件的指南 但是 我们如何使用 pySpark 从 azure databricks 消费事件中心中的事件 任何建议 文档详细信息都会有
  • 如何在 C++ 中终止或停止分离线程?

    我对终止 停止 杀死 C 中的分离线程感兴趣 如何才能做到这一点 void myThread int loop 0 while true std this thread sleep for std chrono seconds 5 loop
  • 带有特殊/unicode 字符的 toLowerCase 会引发异常

    如我错了请纠正我 If str有一个字符 例如 然后运行 str toLowerCase Locale English 抛出空指针异常 这就是我所看到的行为 那么这是怎么回事呢 这是怎么回事 未指定 toLowerCase 抛出空指针异常
  • jqgrid 一列的自定义编辑行为

    我想要一个 jqGrid 对于某一列 不是将单元格变成文本框 而是弹出一个需要填写的表单 关闭表单后 输入的数据将保存到单元格中 用户永远无法直接与单元交互 以免损坏数据 看图片 我有我想要与之交互的用户表 某处也恰好有一张书桌 当用户单击
  • 在铯地形图上导航,破坏图形的位置

    我在我的 gwt 项目中使用 cesium 并且使用 cesium terrain server 来处理地形 不是 cesium gwt 用 jsni 开发我自己的代码 我的问题 我正在地形 多边形 折线 上创建图形 当我在地图上导航时 图
  • Oozie 工作流程:未找到 Hive 表,但它确实存在

    我有一个 oozie 工作流程 在 4 台机器的 CDH4 集群上运行 一台主控机 三台 哑 工作机 hive 元存储使用 mysql 在 master 上运行 存在驱动程序 oozie 服务器也使用 mysql 在 master 上运行
  • 对 property_get 的未定义引用

    我的目标是进行微调以找到适当的线程优先级 我关注的线程位于 hardware my company codec openmax il 下 我修改了2个文件 Android mk 在 LOCAL C INCLUDES 列表中添加 TOP sy
  • 何时使用 Apollo 缓存重定向?

    阿波罗文档讨论使用cacheRedirects https www apollographql com docs react advanced caching html cacheRedirect告诉 Apollo 如何从其他查询访问缓存中
  • 不同类型的二维数组

    我想创建一个二维数组 在其中存储数据库中的记录 所以我们可以说第一个是类型int和第二个类型String 这里我只描述一条记录 所以基本上是数据库列的类型 我该怎么做 数组是正确的数据结构吗 我不确定我是否关注 但您可能正在寻找Map
  • 如何使用 youtube-dl 批量创建 youtube 下载器 gui

    这就是我目前所处的位置 cls echo off title youtube downloader downloader echo youtuber downloader pause cls echo please put the link
  • 帕斯卡三角形二维数组 - 格式化打印输出

    我有一个小作业 必须使用二维数组来生成帕斯卡三角形 这是我的代码 它有效 如果我像这样显示三角形 就会有额外的机会 source daugerresearch com https daugerresearch com vault Pasca
  • 如何禁用http请求标头中的范围选项?

    通过 google chrome 下载 PDF 时 我收到来自服务器的 206 状态响应 在查看 RFC 后 我发现客户端正在发出附加范围标头的条件 GET 请求 有没有办法在发出请求时禁用范围标头或使用不同的浏览器是解决方案 您使用什么服
  • 处理大量 HTTP JSON 响应的最佳方法

    解析来自服务器的 JSON 回复 以 1 个大行返回 的最有效方法是什么 我不想 不需要将此 JSON 映射 到某些自定义 业务对象 因为我只需要结构的特定部分 主要是在一组数组中查找特定的标签及其值 UPDATE 我正在寻找一种有效的方法