Stringify删除了带有Symbol属性的JavaScript对象

时间:2017-07-17 19:54:49

标签: javascript json

我正在尝试通过express发送一个React组件树,我的组件数组包含了关键的$$typeof: Symbol.for('react.element')属性。我正在使用res.send。除了该属性之外,对象的其余部分都会通过。我被告知它可能与Symbol有关。因为不是可枚举的? JSON.stringify也剥夺了财产。

我已将问题缩小为具有Symbol值的属性。这反映在in the documentation for stringify.上。谁能解释为什么会出现这种情况或解决方法是什么?

const obj1 = {
  'stringKey': Symbol.for('String Value'),
  boolKey: true,
  numKey: 1
}

const obj2 = {...obj1, 'stringKey': 'Plain String'}

console.log(JSON.stringify(obj1))
console.log(JSON.stringify(obj2))

1 个答案:

答案 0 :(得分:0)

由于该符号用作值,您可以使用自定义replacer将符号格式化为您可以使用自定义reviver

在接收方恢复的字符串

const obj1 = {
  'stringKey': Symbol.for('String Value'),
  boolKey: true,
  numKey: 1
}

const obj2 = {...obj1, 'stringKey': 'Plain String'}

console.log(JSON.stringify(obj1, (name, value) => {
     if(typeof value === 'symbol') {
        value = `$$${Symbol.keyFor(value)}`
     }
     return value
}))
console.log(JSON.stringify(obj2))

天真的演示。您可以更好地列出应该从注册表中恢复为符号的道具。

const a = {a: Symbol.for('a')}
const str = JSON.stringify(a, (k,v) => typeof v === 'symbol' ? `$$Symbol:${Symbol.keyFor(v)}` : v)
const b = JSON.parse(str, (k,v) => {
  const matches = v.match && v.match(/^\$\$Symbol:(.*)$/)
  return matches ? Symbol.for(matches[1]) : v
})

console.log(a, str, b, a.a === b.a)