什么样的二进制数据不能字符串化为JSON?

我到处都读到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字符串的示例吗?

tian9085 回答:什么样的二进制数据不能字符串化为JSON?

我认为您对此理解不正确。

首先,“ JSON字符串”是什么意思?您是说JSON.stringify()的结果还是JSON文档中的数据类型?让我们看一下后者,因为我认为这是“不能包含二进制数据”语句的含义。

如果您查看spec,则JSON字符串不能包含所有可能的字符。特别是不允许使用控制字符。这意味着JSON字符串不能直接包含任意(二进制)数据。但是,您可以使用转义序列(\u)来表示这些字符,这是一种编码方式。 JSON.stringify()自动为您完成此操作。

例如:

s = String.fromCodePoint(65,66); // A "binary" string,'A',0x00,'B'
JSON.stringify(s); // "A\u0000B";

JSON.parse()也了解这些转义序列,并将恢复二进制数据。

因此JSON字符串数据类型可以编码二进制数据,但如果不进行编码,就不能直接包含所有二进制数据。

一些附加说明:

  • 用JavaScript(和许多其他语言)正确处理二进制数据可能很困难。字符串数据类型不是为二进制数据设计的。例如,您必须知道用于内部存储String数据的编码。
  • 通常,二进制数据不是使用转义序列进行编码,而是使用更有效的编码方案(例如Base64)进行编码。
本文链接:https://www.f2er.com/3084481.html

大家都在问