2

¿Cómo es posible que este código:

console.log('EntroSubscribeTokenBefore', JSON.parse(JSON.stringify(response)));
console.log('EntroSubscribeTokenType', typeof JSON.parse(JSON.stringify(response)));
console.log('EntroSubscribeToken', JSON.parse(JSON.stringify(response)).access_token);
const newToken = Object.assign({}, response);
console.log('NewObject', typeof newToken);
for(let key in newToken){
    console.log('Key:', newToken[key])
}

Pinte este resultado?:

console.log: EntroSubscribeTokenBefore
            {"access_token":"afcddc76-8322-4186-9b54-aa4143f381eb","token_type":"bearer","refresh_token":"fda3fcf4-8335-45cf-94ca-cd0aec1a90cb","expires_in":29605,"scope":"custom
            default","firstname":"testswinetmm_cost","lastname":"testswinetmm_cost","email":"testswinetmm_cost@testingmail.com","uid":"testswinetmm_cost"}
[11:37:46]  console.log: EntroSubscribeTokenType string
[11:37:46]  console.log: EntroSubscribeToken
[11:37:46]  console.log: NewObject object
[11:37:46]  console.log: Key: {
[11:37:46]  console.log: Key: "
[11:37:46]  console.log: Key: a
[11:37:46]  console.log: Key: c
[11:37:46]  console.log: Key: c
[11:37:46]  console.log: Key: e
[11:37:46]  console.log: Key: s
[11:37:46]  console.log: Key: s
[11:37:46]  console.log: Key: _
[11:37:46]  console.log: Key: t
[11:37:46]  console.log: Key: o
[11:37:46]  console.log: Key: k
[11:37:46]  console.log: Key: e
[11:37:46]  console.log: Key: n
[11:37:46]  console.log: Key: "
[11:37:46]  console.log: Key: :
[11:37:46]  console.log: Key: "
[11:37:46]  console.log: Key: a
[11:37:46]  console.log: Key: f
[11:37:46]  console.log: Key: c
...
OscarGarcia
  • 26,999
  • 3
  • 26
  • 61
Hictus
  • 1,704
  • 7
  • 21
  • no funciona porque no lo estas haciendo al asignar response, va a ser una cadena de texto , y por ende cuando haces el for vez cada una de las letras – JackNavaRow Dec 11 '18 at 11:09

1 Answers1

6

En primer lugar, si lo que recibes es una cadena de texto (y no los datos ya tratados como JSON) entonces no deberías usar un JSON.stringify antes del JSON.parse porque estarás convirtiendo una cadena en una cadena entrecomillada durante el stringify, que será convertida de nuevo a cadena en el parse.

En resumen, stringify convierte la cadena hola (por poner un ejemplo) en la cadena "hola" (con comillas). Al hacer parse la cadena "hola" será restaurada al valor inicial, hola (sin las comillas), recuperando exactamente el mismo valor inicial.

En segundo lugar, en la línea:

const newToken = Object.assign({}, response);

Intentas hacer uso de la cadena de caracteres original response, y no los datos JSON obtenidos con parse, por lo que con Object.assign estarás iterando una cadena de caracteres, obteniendo uno a uno los caracteres que la componen en el objeto resultante.

La forma correcta de hacer lo que quieres es:

/* Reproducimos los datos que obtienes en cadena */
let response = '{"access_token":"afcddc76-8322-4186-9b54-aa4143f381eb","token_type":"bearer","refresh_token":"fda3fcf4-8335-45cf-94ca-cd0aec1a90cb","expires_in":29605,"scope":"custom            default","firstname":"testswinetmm_cost","lastname":"testswinetmm_cost","email":"testswinetmm_cost@testingmail.com","uid":"testswinetmm_cost"}';
/* Ahora quitamos todos los JSON.stringify innecesarios */
console.log('EntroSubscribeTokenBefore', JSON.parse(response));
console.log('EntroSubscribeTokenType', typeof JSON.parse(response));
console.log('EntroSubscribeToken', JSON.parse(response).access_token);
/* Hacemos uso de los datos reales, no la cadena de caracteres */
const newToken = Object.assign({}, JSON.parse(response));
console.log('NewObject', typeof newToken);
for(let key in newToken){
    console.log('Key:', newToken[key])
}

Para finalizar (y como sugerencia de @JackNavaRow), recuerda que un JSON no es un Objeto en JavaScript

JackNavaRow
  • 6,836
  • 5
  • 22
  • 49
OscarGarcia
  • 26,999
  • 3
  • 26
  • 61
  • Por supuesto. Adelante. – OscarGarcia Dec 11 '18 at 11:23
  • Hice una edición @JackNavaRow agregando el motivo por el que obtiene uno a uno los caracteres de la cadena en vez de cada uno de los elementos del JSON. – OscarGarcia Dec 11 '18 at 11:36
  • Lo siento, esperé un tiempo antes de hacer la edición, pero viendo que no la habías me puse a hacer la mía x) En cuanto a tus notas, estoy de acuerdo con poner una referencia a la diferencia entre una cadena de texto que contiene información en JSON de un objeto, pero la segunda referencia (los caracteres especiales) creo que no está relacionada con esta pregunta, ¿me equivoco? – OscarGarcia Dec 11 '18 at 11:58