¿Sería posible usar el reviver en la función JSON.parse para cambiar la estructura de los datos que se analizan?

Por ejemplo, ¿cómo puedo analizar la siguiente cadena:

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

Al siguiente objeto?

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

Lo que he intentado es:

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

Pero lo que obtengo es:

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

¿Me puede ayudar a entender lo que estoy haciendo mal?

2
r1pster 22 abr. 2020 a las 00:04

3 respuestas

La mejor respuesta

Así es como lo haría con un reviver:

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

Esa verificación contra la cadena vacía es causada por cómo el reviver camina a través del objeto. La última iteración sucede para tomar su objeto final y la clave para esa verificación final es siempre una cadena vacía. No queremos cambiar nada en ese paso final, por lo que simplemente devolvemos value allí.

1
Robo Robok 21 abr. 2020 a las 21:18

No es necesario envolver con llave. https://jsbin.com/pajosorapa/1/edit?html,js, salida

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
sleepwalker 21 abr. 2020 a las 21:24

Prueba esto. U puede usar Object.keys

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

console.log(assign(JSON.parse(fruitString)));


function assign(obj) {
   Object.keys(obj).forEach(function(key,value){ obj[key] ={"price":obj[key]} });
   return obj;
}
0
Çağrı 21 abr. 2020 a las 21:17