我在任何地方都读到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字符串的例子吗?
发布于 2019-11-18 01:57:35
我认为你没有正确地理解这一点。
首先,“JSON字符串”意味着什么?您是指JSON.stringify()的结果还是JSON文档中的数据类型?让我们来看看后者,因为我认为“不能包含二进制数据”的语句就是关于这个的。
如果查看等级库,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字符串数据类型可以对二进制数据进行编码,但它不能直接包含所有二进制数据,而无需编码。
一些补充说明:
https://stackoverflow.com/questions/58905828
复制相似问题