在本地存储中存储压缩的 json 数据

Posted

技术标签:

【中文标题】在本地存储中存储压缩的 json 数据【英文标题】:Storing compressed json data in local storage 【发布时间】:2014-01-13 11:12:07 【问题描述】:

我想将 JSON 数据存储在本地存储中。有时存储的数据可能超过 5MB(每个域的浏览器允许的最大阈值)。无论如何我可以压缩或压缩数据并将其存储在本地存储中吗?如果对大数据的每个 JS 函数进行压缩和解压,会增加多少延迟?

我正在使用这个 json 数据在网页上显示.....它就像一个静态数据,整个会话几乎相同。我们对此 json 数据提供搜索、过滤等操作...每当用户输入关键字时,我都会搜索存储在本地存储中的 json 数据,而不是调用服务器

【问题讨论】:

您需要存储这些 JSON 数据做什么? 我正在使用这个 json 数据在网页上显示.....它就像一个静态数据,整个会话都是一样的。我们对此 json 数据提供搜索、过滤等操作...每当用户输入关键字时,我都会在存储在 localstorage 中的 json 数据中进行搜索,而不是调用服务器 我非常怀疑。本地存储并非旨在保存大量数据。为什么不将这些数据存储在服务器的缓存中? 将您拥有的所有内容卸载给毫无戒心的用户似乎相当详尽...... 5MB?再多的优化也无法弥补这些带宽影响 - 当您需要时通过 ajax 以小块的形式传输您需要的内容。 @Emissary - 超过 5MB 的可能性非常小。大多数时候,我都提供相同的响应。对于这种情况,当我可以从本地存储服务时,为什么还要向服务器发送另一个请求?第一次我只想通过 ajax 调用获取数据。 【参考方案1】:

由于 localStorage 功能似乎仅限于处理字符串键/值对,您可以使用lz-string library 将 json 对象字符串化并在将其存储到 localStorage 之前对其进行压缩

用法

// sample json object
var jsonobj = 'sample': 'This is supposed to be ling string', 'score': 'another long string which is going to be compressed'

// compress string before storing in localStorage    
localStorage.setItem('mystring', LZString.compress(JSON.stringify(jsonobj)));

// decompress localStorage item stored
var string = LZString.decompress(localStorage.getItem('mystring'))

// parse it to JSON object
JSON.parse(string);

检查 jsfiddle http://jsfiddle.net/raunakkathuria/7PQtC/1/,因为我已经复制了完整的脚本,所以在小提琴末尾寻找运行代码

如果您正在处理 UTF 字符,请使用 compressToUTF16decompressFromUTF16,但请注意生成的字符串因此比 compress 生成的字符串大 6.66%。因此,仅在需要时使用utf

【讨论】:

在存储到本地存储之前,您是否建议使用任何加密算法进行变形? 有一个code.google.com/p/crypto-js/#CryptoJS_3.1但是没用过所以不能推荐 它在 lz-string 网站上说 compress 产生无效的 UTF16 字符串,并且只能在 webkit 浏览器上工作。 compressToUTF16compressFromUTF16 应该用于跨浏览器兼容性。 感谢@vanneto,更新了答案以反映您的评论。

以上是关于在本地存储中存储压缩的 json 数据的主要内容,如果未能解决你的问题,请参考以下文章

在本地将 Firebase 数据存储为 JSON

如何将 JSON 数据存储和检索到本地存储中?

通过 Angular 5 读取/下载 JSON 文件并将数据存储在本地 JSON 文件中

H5笔记——locaStorage和sessionStorage本地存储的一些坑

解析 JSON 文件(本地存储),从而快速创建对象数组

Unity 中存储数据到JSON本地文件