【发布时间】:2021-01-16 23:43:07
【问题描述】:
用户可以从我们的应用程序中下载 JSON 文件,我想对其进行美化以便于调试,而不是全部在一行中。然而,即使缩进只是一个制表符或空格,这也会使文件大小增加近 40%。
作为妥协,我想排除所有值,例如美化的关键“大”,像这样:
{
"small":
{
"a": 1,
"b": 2,
"large": {"a":1,"b":2,"c":3,"d":"the \"large\" object should not be prettified"}
},
"large": {"a":1,"b":2,"c":3,"d":"the \"large\" object should not be prettified"}
}
我尝试使用 JSON.stringify 的replacer parameter 来解决这个问题:
JSON.stringify(data,(key,value)=>key==="large"?JSON.stringify(data):value,'\t');
但是“大”键的值最终被转义:
data =
{
"small":
{
"a": 1,
"b": [2,3,4,5],
"large": {"myarray":[1,2,3,4],"b":2,"c":3,"d":"the \"large\" object should not be prettified"}
},
"large": {"a":1,"b":2,"c":3,"d":"the \"large\" object should not be prettified"}
}
const json = JSON.stringify(data,(key,value)=>key==="large"?JSON.stringify(data):value,'\t');
document.getElementById("json").innerText = json;
<html>
<body>
<pre id="json">
</pre>
</body>
</html>
如何防止这种转义发生或以其他方式在 JavaScript 中部分美化 JSON?
【问题讨论】:
-
"但是这会使文件大小增加近 40%" 这真的是个问题吗?数据不会通过网络,因为它都包含在客户端上,所以它不会真正花费更多时间来传输,或者占用更多带宽,或者以任何方式影响用户的数据上限(如果有的话) )。最多,它会在磁盘上占用更多空间,但除非您的 .json 文件占用数百兆字节或您生成成千上万个文件,否则我认为驱动器空间不应该成为问题。
-
除了@VLAZ所说的:启用gzip压缩。这将有助于减少空白对您的无线文件大小的影响。
-
@RickN 是的,这会有所帮助。事实上,它很可能已经生效了——大多数情况下 gzipping 是默认启用的。但是,由于此数据不会从服务器传输到客户端,因此不会被压缩。没必要,它已经在客户端了——用户的机器会产生数据,然后用户会“下载”这些数据——基本上它会从RAM保存到磁盘。
-
我认为你必须自己实现字符串化。有一些解决方法(例如用随机 5 个字符替换密钥,然后用压缩的 JSON 替换表示),但我认为它们很难看。
-
您对我现在已删除的答案的评论是对的,内部引号使这种方式比看起来更难,以至于将您的
d字符串更改为某事可能是个好主意确实有这样的内部引号。
标签: javascript json stringify prettify