Использование JSON .Parse Reviver для преобразования объекта - PullRequest
2 голосов
/ 22 апреля 2020

Можно ли использовать reviver в функции JSON .parse для изменения структуры анализируемых данных?

Например, как я могу проанализировать строку ниже:

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
>                   }
>                }
>             }
>           }
>        }

Пожалуйста, не могли бы вы помочь мне понять, что я делаю неправильно?

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Не нужно оборачивать ключом. https://jsbin.com/pajosorapa/1/edit?html, js, выход

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));
1 голос
/ 22 апреля 2020

Вот как вы это сделаете с реверирующим:

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

Эта проверка на пустую строку вызвана тем, как ревивер проходит через объект. Последняя итерация принимает ваш последний объект, и ключом для этой последней проверки всегда является пустая строка. Мы не хотим ничего менять на этом последнем шаге, поэтому мы просто возвращаем value туда.

...