Tengo algunos problemas con un objeto JSON que recibo de mi servidor. El uso de console.log en el objeto JSON muestra correctamente el objeto JSON que envié desde el servidor, pero cuando intento iterar sobre las claves, comienza a actuar de manera extraña. Vea abajo.
> console.log(promotions); {"promotion1":{"color":"white","backgroundColor":"red","text":"from promotion server"},"promotion2":{"color":"purple","backgroundColor":"yellow","text":"from promotion server2"},"promotion3":{"color":"green","backgroundColor":"black","text":"from promotion server3"}} > for (p in promotions) { console.log(p); } 0 1 2 3 4 ... (continues) 264 265 266 bold strip stripColors trap zalgo zebra rainbow random america reset dim italic underline inverse hidden strikethrough black ... (continues) magentaBG cyanBG whiteBGAlgunos detalles más:
Estoy enviando una solicitud desde un servidor ExpressJS usando http.request a otro servidor ExpressJS, que luego devuelve el objeto JSON de "promoción". No he podido saber si de alguna manera se corrompe (¿podría haber configurado mal la codificación?).
Probar usando el mismo objeto JSON pero codificado en lugar de enviarlo desde el otro servidor, da la respuesta correcta.
¡Gracias!
Su valor de promotions es la representación de cadena del JSON. Entonces, cuando haces tu ciclo for, itera a través de él como una cadena.
var promotions = '{"promotion1":{"color":"white","backgroundColor":"red","text":"from promotion server"},"promotion2":{"color":"purple","backgroundColor":"yellow","text":"from promotion server2"},"promotion3":{"color":"green","backgroundColor":"black","text":"from promotion server3"}}'; for (var p in promotions) { console.log(p); }Para saber por qué hace esto, vea estapregunta relacionada (aunque la verdad es que es solo una extraña consecuencia del hecho de que las cadenas son matrices detrás de escena, en cuyo caso debería mirar esta respuesta )
Si lo haces
var promotions = '{"promotion1":{"color":"white","backgroundColor":"red","text":"from promotion server"},"promotion2":{"color":"purple","backgroundColor":"yellow","text":"from promotion server2"},"promotion3":{"color":"green","backgroundColor":"black","text":"from promotion server3"}}'; // convert string representation of JSON into actual object var promotionsObject = JSON.parse(promotions); for (var p in promotionsObject) { console.log(p); }Debería funcionar como se esperaba. Solo tenga en cuenta que si desea revisar cada objeto e imprimir las propiedades de esos, deberá hacer un trabajo adicional. Ver Imprimir JSON anidado sin usar nombres de variables
Intente filtrar las propiedades que pertenecen al prototipo.
for (var p in promotions) { if (promotions.hasOwnProperty(p)) { console.log(p); } }