JSON 会发展为对 Ecmascript 地图对象提供本机支持吗?

Will JSON Evolve to Have Native Support for Ecmascript Map Objects?

是否有任何正式提案正在进行中,以解决 JSON 当前对 Map 对象的处理方式的向后兼容演化?

例如,假设您要将 Map 转换为 JSON,然后将其写入文件:

let map = new Map();
map.set(1, "A");
map.set(2, "B");
map.set(3, "C");

// Convert map to an "array of 2-element arrays":
let arrayFromMap = [... map];

let json = JSON.stringify(arrayFromMap);
writeJSONtoFile(json,"path/to/jsonFile.json");

现在我们在磁盘上有一个 JSON 文件。问题是,最终读取此文件的代码不知道它包含一个 Map 对象,除非我们向该代码文件提供这种意识。 JSON 中没有任何内容可以明确指示 Map 而不是 "array of 2-element arrays"。例如,没有此 awareness 的代码可能会这样做:

let json = readJSONfromFile("path/to/jsonFile.json");
let parsedJSON = JSON.parse(json);
console.log(parsedJSON); // outputs an "array of 2-element arrays"

但是,如果代码编写者提供代码意识(原始类型是 Map),则文件可以转换回 Map:

let json = readJSONfromFile("path/to/jsonFile.json");
let map = new Map(JSON.parse(json));

同样的意识对于这些内置函数来说不是必需的:对象和数组。

在上面的示例中,此 "awareness" 要求并不太繁琐。但是,想象一个包含地图和 "arrays of 2-element arrays" 的大型层次结构,它们不打算成为地图。此 "awareness burden" 现在已扩展到层次结构中的

是否有任何正式提案正在进行中,以解决 JSON 当前对 Map 对象的处理方式的向后兼容演化?

不,因为 JSON 表示法虽然起源于 Javascript,但广泛用于大量语言,但 Javascript 映射仅在上下文中有意义共 Javascript.

对 JSON 表示法进行任何形式的更改以允许仅在 Javascript 中有意义的对象的序列化和反序列化将使 JSON 格式与大多数其他语言不兼容。

这并不是说不能编写基于 JSON 的自定义解析器来正确序列化和反序列化 Maps,但这样的事情只会 基于 JSON,而不是 JSON 标准的补充。

与 CertainPerformance 的回答一样,为了便携性和兼容性,JSON 尽可能保持抽象很重要。

想补充一点,保持 JSON 对象内部 Map 对象的完整性非常简单,无需添加新规范;就像在序列化期间为每个 Map 添加一个标志。