【问题标题】:Using the JSON.Parse Reviver to transform an object使用 JSON.Parse Reviver 转换对象
【发布时间】:2020-04-21 21:04:43
【问题描述】:

是否可以在 JSON.parse 函数上使用 reviver 来更改正在解析的数据的结构?

例如,如何解析下面的字符串:

fruitString = "{"Apple":2,"Orange":4}";

到以下对象?

fruitPrices: {
     "Apple":{
         "price": 2
     },
     "Orange":{
         "price": 4
     }
}

我试过的是:

let fruitPrices = JSON.parse(fruitString, (key, value) => {
                      return {key: {'price' => value}};
                  });

但我得到的是:

>      fruitPrices:{
>         key:{
>            price:{
>               Apple:{
>                  key:{
>                     price:2
>                   }
>                }
>               Orange:{
>                  key:{
>                     price:4
>                   }
>                }
>             }
>           }
>        }

请你帮我理解我做错了什么?

【问题讨论】:

  • 你为什么要使用 JSON.parse 来解决这个问题?为什么不解析然后映射到您需要的内容?我认为这应该是要走的路
  • 我想了解 reviver 回调函数是如何工作的。如果可能的话,我宁愿在解析数据时映射数据而不添加其他步骤。

标签: javascript json parsing


【解决方案1】:

以下是你如何使用复苏器:

let fruitPrices = JSON.parse(
    fruitString,
    (key, value) => key === '' ? value : {price: value}
);

对空字符串的检查是由 reviver 遍历对象的方式引起的。最后一次迭代恰好取了您的最终对象,并且最终检查的键始终是一个空字符串。我们不想在最后一步中更改任何内容,因此我们只返回 value 那里。

【讨论】:

  • 谢谢。我无法理解对象是如何被遍历的,但这是有道理的。
【解决方案2】:

无需用密钥包装。 https://jsbin.com/pajosorapa/1/edit?html,js,output

var fruitString = "{\"Apple\":2,\"Orange\":4}";
var fruitPrices = JSON.parse(fruitString, (key, value) => {
  if (typeof(value) === 'number'){
    return { 'price': value };
  }

  return value;
});
console.log(JSON.stringify(fruitPrices));

【讨论】:

  • 谢谢。鉴于最终值是一个数字,这很有效。
猜你喜欢
  • 2018-04-02
  • 1970-01-01
  • 2012-05-22
  • 1970-01-01
  • 1970-01-01
  • 2015-04-22
  • 2012-12-27
  • 1970-01-01
  • 2017-05-03
相关资源
最近更新 更多