【问题标题】:JSON.stringify(new Map()) prints '[]' instead of '{}' for a particular orgJSON.stringify(new Map()) 为特定组织打印 '[]' 而不是 '{}'
【发布时间】:2020-11-27 17:06:42
【问题描述】:

我们是否有办法访问我们可以使用或自定义的 JSON.stringify 的本机代码?似乎在一个特定的站点中,我遇到了 JSON.stringify(new Map()) 给出 '[]' 而不是 '{}' 的问题。此本机代码可能存在一些自定义,但我无法缩小范围。

有人遇到过这个问题吗?任何线索都会有所帮助。

【问题讨论】:

  • JSON.stringify(new Map()) 为我返回 {}。也许你在某处有Map polyfill?

标签: javascript json dictionary


【解决方案1】:

我无法重现该问题。当我对新地图进行字符串化时,我得到{}

也就是说,解决此类问题的一般方法如下:


本机代码是特定于浏览器的,通常用 C 语言编写,并且根据浏览器的不同可能是开源的,也可能不是开源的。无论哪种方式,它可能对您都不是很有用。

如果您想要自定义处理某种类型的对象,请将替换函数作为第二个参数传递给stringify,并让它对Map 对象执行自定义操作。

const data = new Map();
const replacer = (key, value) => {
  if (value instanceof Map) {
    return {};
  }
  return value;
};
const json = JSON.stringify(data, replacer, 2);
console.log(json);

【讨论】:

  • Map 提供 {} 的实现不依赖于实现 - JSON.stringifyiterate over enumerable own-properties 并将它们放入 {}s 中,但 Maps 没有可枚举的自身属性。由于 OP 有JSON.stringify(new Map()) 提供'[]',那么Map.prototype.toJSON 可能已被覆盖。
【解决方案2】:

您可以将Map.prototype.toJSON 更改为返回[] 而不是{}

Map.prototype.toJSON = () => [];
console.log(JSON.stringify(new Map()));

因此,如果您正在寻找为什么序列化 Map 给出 [] 而不是 {},请在代码库中搜索对 toJSON 的更改。

(但这很奇怪,并且会打破大多数开发人员通常的期望 - 地图不可序列化,因此应避免尝试隐式这样做)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 2023-01-10
    • 2020-08-07
    • 1970-01-01
    相关资源
    最近更新 更多