2012-04-28 24 views
7

Convertir esto:de cómo extraer un objeto JSON que está dentro de un objeto JSON

{"items":[{"id":"BLE89-A0-123-384","weight":"100","quantity":3}, 
      ...  
      {"id":"BLE10-A0-123-321","weight":"100","quantity":4}], 
"country":"JUS", 
"region":"A", 
... 
"timeout":"FILLER"} 

A esto:

{"BLE89-A0-123-384": "3", "BLE10-A0-123-321": "4"} que es ... {id: Cantidad}

encontré una respuesta que casi hace lo que necesito: Searching for an Object inside the JSON. Pero esa respuesta no me ayuda porque está solo en el primer nivel (un objeto json). Mi problema está en el segundo nivel (objeto json dentro de un objeto json). ¡Gracias por adelantado!

+1

'{" BLE89-A0-123-384 "," 3 "; "BLE10-A0-123-321", "4"} 'Eso ni siquiera es un objeto válido, necesita ser un par de valores clave. –

+0

lo siento, lo arreglé! – mrmo123

+0

¿Qué * no * sabes cómo hacer? ¿Sabes cómo acceder a un miembro de una matriz u objeto? ¿Sabes cómo iterar una matriz? ¿Sabes cómo crear un objeto y asignarle nuevos pares clave/valor? Sería bueno saber exactamente con qué necesita ayuda. –

Respuesta

21

Sirve de ayuda si usted no piensa de objetos JSON como objetos JSON. Una vez que ejecuta una cadena JSON a través de JSON.parse, es un objeto JavaScript nativo.

En JavaScript, hay dos formas de acceder a los objetos.

Dot notación

La notación de puntos es la siguiente

myObject.name

ver el punto? Puede usar eso para acceder a cualquier propiedad del objeto (que de hecho puede ser otro objeto en javascript, siempre que tenga un nombre de notación de punto válido). No puede usar caracteres como -, . y el carácter de espacio.

soporte de notación (puede ser otro nombre)

myObject["variableName"]

Al igual que la notación de puntos pero permite algunos otros personajes, como - y el carácter de espacio .. Es exactamente lo mismo.

Usar estas notaciones es útil porque podemos acceder a propiedades anidadas.

myObj.foo.bar.baz()

Ahora vamos a llegar a su objeto JSON ...

{"items":[{"id":"BLE89-A0-123-384","weight":"100","quantity":3,"stock":0},
{"id":"BLE10-A0-123-321","weight":"100","quantity":4,"stock":0}],

Es posible que desee poner al día la JSON format mismo, pero en su ejemplo, he aquí algunas pistas ..

{ Significa el inicio de un objeto. (Tenga en cuenta que toda la cadena JSON es un objeto en sí).

} Significa el final de un objeto.

"variable" (con comillas! Importante en JSON, pero no al acceder/declarar objetos javascript) le asigna una propiedad a su objeto.

: Es el operador de asignación en los objetos JSON y JavaScript. Cualquier cosa a la derecha del : es el valor que está asignando a la propiedad de la izquierda.

, Significa que está iniciando una nueva propiedad dentro de un objeto.

Probablemente sepa que [] con , comas dentro significa una matriz.

Cuando se corre la cadena a través JSON.parse(string), conseguiremos un objeto que se parece a esto ...

var myResponse = JSON.parse(response);

Ahora puede utilizar como un objeto JavaScript nativo. Lo que estás buscando es una propiedad anidada dentro de "artículos".

var items = myResponse.items; //alternatively you could just use myResponse.items

Desde items es una matriz de objetos , tendremos que iterar a través de él con el fin de convertir el objeto existente en un nuevo objeto.

var i; 
var result = {} ; //declare a new object. 
for (i = 0; i < items.length; i++) { 
    var objectInResponse = items[i]; //get current object 
    var id = objectInResponse.id; //extract the id. 
    var quantity = objectInResponse.quantity; 
    result[id] = quantity; //use bracket notation to assign "BLE89-A0-123-384" 
    //instead of id. Bracket notation allows you to use the value 
    // of a variable for the property name. 

El resultado es ahora un objeto que se parece a:

{ 
    "BLE89-A0-123-384" : 3, //additional properties designated by comma 
    "BLE10-A0-123-321" : 4 // The last key/value in an object literal CANNOT 
    // have a comma after it! 
} 

Puede acceder a las propiedades utilizando notación de corchetes.

var BLE89 = result["BLE10-A0-123-321"]; //use quotes, otherwise JavaScript will try to look up the value of a variable.

+0

+1 para una explicación completa. –

+0

Guau, esa es una respuesta mucho más completa de lo que esperaba para la pregunta: D – epidemian

+0

gracias por la gran respuesta! – mrmo123

0

que tiene que hacer lo siguiente:


var newJSON = {}; 
for (var i = 0; i < oldJSON.items.length; i++) { 
    newJSON[oldJSON.items[i].id] = oldJSON.items[i].quantity; 
} 
+0

'.length()' tiene que ser '.length'. La longitud es una propiedad, no una función. –

2

Usted puede tratar con:

var obj = { 
    "items":[ 
     {"id":"BLE89-A0-123-384","weight":"100","quantity":3}, 
     {"id":"BLE10-A0-123-321","weight":"100","quantity":4} 
    ], 
    "country":"JUS", 
    "region":"A", 
    "timeout":"FILLER" 
}; 

var quantities = {}; 
obj.items.forEach(function (item) { 
    quantities[item.id] = item.quantity; 
}); 

quantities será entonces el objeto {"BLE89-A0-123-384":3,"BLE10-A0-123-321":4}. forEach es un método nativo de objetos de matriz en JavaScript que le permite recorrer sus elementos. Es posible que desee colocar ese fragmento de código dentro de una función:

function getQuantities(obj) { 
    var quantities = {}; 
    obj.items.forEach(function (item) { 
     quantities[item.id] = item.quantity; 
    }); 
    return quantities; 
} 
+0

gracias !!!!!! – mrmo123