如何发送和接收大型 JSON 数据

Posted

技术标签:

【中文标题】如何发送和接收大型 JSON 数据【英文标题】:How to send and receive large JSON data 【发布时间】:2018-12-21 07:43:06 【问题描述】:

我对全栈开发比较陌生,目前正试图找出一种有效的方法来处理我的前端 (React) 和后端 (Express) 之间的 sendfetch 大数据,同时最小化内存使用情况。具体来说,我正在构建一个地图应用程序,它需要我使用大型 JSON 文件 (10-100mb)。

我当前的设置适用于较小的 JSON 文件:

后端:

const data = require('../data/data.json');

router.get('/', function(req, res, next) 
  res.json(data);
);

前端:

componentDidMount() 
      fetch('/')
      .then(res => res.json())
      .then(data => this.setState(data: data));
  

但是,如果 data 大于 ~40mb,如果我在本地测试由于内存不足,后端会崩溃。此外,使用require() 保存数据也需要相当多的内存。

我做了一些研究,对 JSON 解析、字符串化、流式传输有了大致的了解,我认为答案就在某个地方,即使用分块 json 流来一点一点地发送数据,但我几乎不知所措它的实现,尤其是使用单个fetch() 来实现(这甚至可能吗?)。

非常感谢有关如何解决此问题的任何建议。

【问题讨论】:

我认为您的用户必须在某些时候滚动才能查看下一组数据,比如在 10 组之后。为什么不创建一个限制一次性发送给用户的数据的端点。然后从您的前端查看用户是否已到达滚动的末尾。如果是,则再次提出后续请求。现在处理来自您的快速端点的后续请求并限制为下一个 10。来自前端的简单请求看起来像 fetch('exampel.com/get-users?page=2') 如果没有敏感数据,您可以在将数据发送给用户之前对其进行压缩。浏览器可以解压。 【参考方案1】:

首先,40mb 是巨大的,对您的用户来说可能是不体面的,尤其是在移动设备使用的可能性很高的情况下。

如果可能,最好在后端收集这些数据,可能会将其放到磁盘上,然后只在需要时向前端提供必要的数据。由于地图需要更多数据,您将进一步调用后端。

如果这不可行,您可以使用客户端捆绑包加载此数据。如果数据更新不是太频繁,您甚至可以将其缓存在前端。这至少可以防止用户需要重复获取它。

或者,您可以通过服务器上的流读取 JSON 并将数据流式传输到客户端,然后使用 JSONStream 之类的东西来解析客户端上的数据。

这是一个如何通过套接字从服务器传输 JSON 的示例:how to stream JSON from your server via sockets

【讨论】:

这很有帮助,谢谢!我会继续尝试您的建议

以上是关于如何发送和接收大型 JSON 数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在Django中接收JSON格式的数据

.net mvc服务端怎么接收客户端的发送的json数据?

如何通过 POST (Ajax) 发送 JSON 数据并从 Struts 2 操作接收 JSON 响应

在 redux 的 post 请求中发送大型 json 数据

如何在 javascript 中使用表单数据上传大型 JSON 对象?

如何在backbone.js中安全地发送/接收数据