我到处都读到过 JSON 无法编码二进制数据,因此我编写了这个简单的测试来检查这是否属实。
function test(elem){
let reader = new FileReader ;
reader.onload = ()=>{
let json = JSON.stringify(reader.result) ;
let isCorrect = JSON.parse(json) === reader.result ;
alert('JSON stringification correct: ' + isCorrect) ;
} ;
reader.readAsBinaryString(elem.files[0]) ;
}
Choose a binary file: <br>
<input type=file onchange="test(this)">
您必须从计算机中选择一个二进制文件,test
函数会将该文件作为二进制字符串读取,然后JSON.stringify
该字符串,然后解析它并与原始二进制字符串进行比较。
我尝试过很多很多的二进制文件(主要是 .exe 文件),但我就是找不到一个不能进行 JSON 化的文件。
您能举一个无法转换为 JSON 字符串的示例吗?
最佳答案
我认为你没有正确理解这一点。
首先,“JSON 字符串”是什么意思?您是指 JSON.stringify() 的结果还是 JSON 文档中的数据类型?让我们看看后者,因为我认为这就是“不能包含二进制数据”这一说法的含义。
如果你看spec JSON 字符串不能包含所有可能的字符。特别是不允许使用控制字符。这意味着 JSON 字符串不能直接包含任意(二进制)数据。但是,您可以使用转义序列 (\u
) 来表示这些字符,这是一种编码类型。 JSON.stringify()
自动为您完成此操作。
例如:
s = String.fromCodePoint(65,0,66); // A "binary" string, 'A', 0x00, 'B'
JSON.stringify(s); // "A\u0000B";
JSON.parse()
也知道这些转义序列并将恢复二进制数据。
因此 JSON 字符串数据类型可以对二进制数据进行编码,但它不能在不编码的情况下直接包含所有二进制数据。
一些附加说明:
- 在 JavaScript(和许多其他语言)中正确处理二进制数据可能很困难。字符串数据类型不是为二进制数据设计的。例如,您必须知道用于内部存储字符串数据的编码。
- 通常,二进制数据不使用转义序列进行编码,而是使用更高效的编码方案(例如 Base64)进行编码。
关于javascript - 什么样的二进制数据不能字符串化为 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58905828/