1

我正在尝试使用 reviver 函数将 JSON 对象列表解析为名为 jsonStructure 的变量,该函数将 5 添加到 stringData 变量中的“年份”对象。但是,该变量返回未定义。我不确定我做错了什么,因为我的解析器设置与本书设置的完全一样。下面是我的代码:

var stringData = '{ "year": 2011, "month": 8, "day": 9, "hour": 5, "minute": 32 }';

var jsonStructure = JSON.parse(stringData, function (key, value) {
   if (key == "year")
      return value + 5;
});
4

2 回答 2

1

问题

这里的问题是,如果键不匹配year,您不会返回任何值,从而有效地使其他所有内容都未定义

解决方案

我们需要始终确保从我们的 reviver 中返回一个值:

var stringData = '{ "year": 2011, "month": 8, "day": 9, "hour": 5, "minute": 32 }';

var jsonStructure = JSON.parse(stringData, function (key, value) {
  return key == "year" ? value + 5 : value;
});


console.log(jsonStructure)

解释

MDN 文档站点:

使用 reviver 参数

如果指定了 reviver,则解析计算的值在返回之前进行转换。具体来说,计算值及其所有属性(从最嵌套的属性开始并继续到原始值本身)分别通过 reviver 运行。然后它被调用,包含正在处理的属性的对象作为 this,属性名称作为字符串,属性值作为参数。如果 reviver 函数返回 undefined(或不返回值,例如,如果执行超出函数末尾),则从对象中删除该属性。否则,该属性被重新定义为返回值。

于 2020-10-21T20:54:51.770 回答
0

var stringData = '{ "year": 2011, "month": 8, "day": 9, "hour": 5, "minute": 32 }';

var jsonStructure = JSON.parse(stringData, function(key, value) {
  if (key == "year") {
    return value + 5;
  }
  return value
});

console.log(jsonStructure);

于 2020-10-21T20:56:10.573 回答