2011-05-18 11 views
12

Recibo una respuesta JSON del servidor y tengo que recorrer la matriz en javascript y obtener los valores. Pero no puedo mirarlo.¿Cómo recorrer una matriz asociativa JSON en javascript?

La respuesta JSON de la matriz tiene el siguiente aspecto:

{ 
   "1": "Schools", 
   "20": "Profiles", 
   "31": "Statistics", 
   "44": "Messages", 
   "50": "Contacts" 
} 

sólo quiero bucle a través de él para obtener el identificador y el nombre y poblar algunos valores en la página.

que he intentado:

$.each(response, function(key, value) { 
    alert(key + ' ' + value); 
}); 

// and 

for (var key in response) { 
    alert(key + ' ' + response[key]); 
} 

Pero ni dar los valores correctos.

Gracias de antemano por cualquier ayuda.

de respuesta: Hola, La respuesta me estoy haciendo con el segundo bucle es:

0 { 
1 " 
2 1 
3 " 
4 : 
5 " 
6 S 

, etc, etc

Por lo que significa su ir a través de toda la respuesta como una cadena y que spliting como clave/valor

Gracias

+1

¿Qué "valores equivocados" está obteniendo? – jvenema

+0

¿Qué sucede cuando pruebas estas estrategias (aparentemente correctas)? Obtendrá mejores respuestas si incluye los valores erróneos ... – maerics

+1

Su segundo ejemplo funciona bien: http://jsfiddle.net/vgvw9/ ¿Qué exactamente no funciona? – JohnP

Respuesta

17

Su problema es que no está analizando la cadena JSON. Por lo tanto, su foreach está pasando por los caracteres en la cadena JSON. Apuesto a que fallará en IE < 7 ya que no trata las cadenas como matrices de caracteres.

// If you are using jQuery.ajax, you can just set dataType to 'json' 
// and the following line will be done for you 
var obj = jQuery.parseJSON(response); 
// Now the two will work 
$.each(obj, function(key, value) { 
    alert(key + ' ' + value); 
}); 


for (var key in obj) { 
    alert(key + ' ' + response[key]); 
} 
+0

Gracias, eso funcionó. – ssin

+0

si la url de la que está extrayendo datos está alojada en un sitio diferente, debe asegurarse de que los datos estén codificados json en su extremo y cambie el tipo de datos a 'jsonp'. jQuery agrega un hash Callback a la solicitud para que sepa a qué función devolver el resultado. Tenga en cuenta que el tercero debe estar json_encoded o que el tipo mime será incorrecto cuando se realice la devolución de llamada. –

+0

@DaveCottrell Parece completamente ajeno a la pregunta en sí, no estoy seguro de por qué sentiste la necesidad de agregar el comentario. Claro que hay preocupaciones de dominio cruzado, pero el OP no está preguntando sobre eso, se habían olvidado de analizar el JSON, solo estás agregando ruido ... –

1

http://jsfiddle.net/sG5sF/

jQuery.each funciona bien. Así es for-each bucle

http://jsfiddle.net/TfjrS/

Ambos trabajan como deberían. Es posible que tenga errores en otras partes de su código. ¿La variable response está establecida correctamente en el objeto JSON que se muestra en su pregunta? ¿Estás revisando el código de estado de respuesta? debería ser 200 para una respuesta exitosa?

2
var response = {"1":"Schools","20":"Profiles","31":"Statistics","44":"Messages","50":"Contacts"}; 

for (var i in response) { 
    console.log(i + ' ' + response[i]); 
} 

Funciona bien, ¿cómo vas a obtener tu respuesta var?

0

Puede usar for-in construir en Javascript puro. Por supuesto, hay que tener cuidado de que sólo está buscando en las propiedades propias del objeto (librerías como Prototype tienden a contaminar):

for(var key in response) { 
    if(response.hasOwnProperty(key)) { 
     ... 
    } 
} 

EDITAR

¿Está utilizando jQuery.ajax? ¿Cuál es el valor dataType? Debe ser json. Esta podría ser la razón por la cual su respuesta se interpreta como una cadena. Además, cuando responde console.log, ¿aparece como una cadena o un objeto?

+0

@Vivin: ¿Por qué usa hasOwnProperty? ¿Está utilizando Prototype u otra biblioteca que aumente el prototipo de Object? De lo contrario, un objeto literal solo recorrerá los valores en th e JSON. –

+0

@JuanMendes: Es algo que hago solo para estar seguro (Probablemente estoy siendo paranoico). Si está seguro de que nunca va a utilizar una biblioteca que contamina el espacio de nombres, entonces no hay necesidad de 'hasOwnProperty'. –

+0

@Vivin Paliath: Es una muy mala compensación, "Voy a ajustar todos mis bucles con hasOwnProperty porque algún día podría usar una biblioteca que aumente Object.prototype". Incluso Prototype dejó de hacerlo porque vieron lo malo que era (se vieron forzados). Creo que es una válvula de seguridad tonta. Mismo mal que la optimización prematura. Si una biblioteca aumenta los objetos nativos, me mantengo alejado de ella, no muchas bibliotecas lo hacen hoy en día. Piense en YAGNI http://en.wikipedia.org/wiki/You_ain't_gonna_need_it. Además, para los ejemplos de SO, debe mantenerlos lo más delgado posible. –

2

No necesita hacer eso, trabajar con cuerdas es un trabajo aburrido. Puedes hacer un objeto a través de la respuesta. 1: json = eval(xmlHttp.responseText);

pero esto no es seguro en cierto grado.

  1. json = JSON.parse(xmlHttp.responseText, function(key,value){// can do some other stuff here.});

entonces usted puede operar la variable como un objeto normal como esta obj.a o obj [ "a"].

Puede que esto lo ayude.

Cuestiones relacionadas