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

标签 javascript json binary-data binary-serialization

我到处都读到过 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/

相关文章:

javascript - 通过 javascript 动态更改元标记内容

javascript - 根据浏览器窗口的大小动态调整 div 的大小

php - 无法从 [object HTMLInputElement] 传递值

javascript - 如果二进制数据是 "4 byte single format",这意味着什么?如何在 JavaScript 中读取它?

linux - 巨大的二进制文件几乎缩小了 100%?

javascript - 从可拖动标记前往新街道和城镇

javascript - 检查 json key 的使用情况

ios - 使用 Alamofire 使用来自 JSON 的 URL 加载图像

javascript - 从本地存储打印 json 对象

.net - 简明二进制对象表示(CBOR)的任何 .NET 实现?