Estoy usando Sencha Touch (ExtJS) para obtener un mensaje JSON del servidor. El mensaje que recibo es este:
{
"success": true,
"counters": [
{
"counter_name": "dsd",
"counter_type": "sds",
"counter_unit": "sds"
},
{
"counter_name": "gdg",
"counter_type": "dfd",
"counter_unit": "ds"
},
{
"counter_name": "sdsData",
"counter_type": "sds",
"counter_unit": " dd "
},
{
"counter_name": "Stoc final",
"counter_type": "number ",
"counter_unit": "litri "
},
{
"counter_name": "Consum GPL",
"counter_type": "number ",
"counter_unit": "litri "
},
{
"counter_name": "sdg",
"counter_type": "dfg",
"counter_unit": "gfgd"
},
{
"counter_name": "dfgd",
"counter_type": "fgf",
"counter_unit": "liggtggggri "
},
{
"counter_name": "fgd",
"counter_type": "dfg",
"counter_unit": "kwfgf "
},
{
"counter_name": "dfg",
"counter_type": "dfg",
"counter_unit": "dg"
},
{
"counter_name": "gd",
"counter_type": "dfg",
"counter_unit": "dfg"
}
]
}
Mi problema es que no puedo analizar este objeto JSON para poder usar cada uno de los objetos de contador.
Estoy tratando de lograr eso de esta manera:
var jsonData = Ext.util.JSON.decode(myMessage);
for (var counter in jsonData.counters) {
console.log(counter.counter_name);
}
Qué estoy haciendo mal ? ¡Gracias!
javascript
json
extjs
maephisto
fuente
fuente
Respuestas:
Javascript tiene un análisis JSON integrado para cadenas, que creo que es lo que tienes:
var myObject = JSON.parse("my json string");
usar esto con su ejemplo sería:
var jsonData = JSON.parse(myMessage); for (var i = 0; i < jsonData.counters.length; i++) { var counter = jsonData.counters[i]; console.log(counter.counter_name); }
Aquí hay un ejemplo de trabajo
EDITAR : Hay un error en el uso del bucle for (me perdí esto en mi primera lectura, crédito a @Evert por el lugar). el uso de un bucle for-in establecerá var para que sea el nombre de propiedad del bucle actual, no los datos reales. Vea mi bucle actualizado arriba para el uso correcto
IMPORTANTE : el
JSON.parse
método no funcionará en navegadores antiguos, por lo que si planea hacer que su sitio web esté disponible a través de algún tipo de conexión a Internet, esto podría ser un problema. Sin embargo, si realmente está interesado, aquí hay una tabla de soporte (que marca todas mis casillas).fuente
Esta es mi respuesta,
fuente
En un bucle for-in, la variable en ejecución contiene el nombre de la propiedad, no el valor de la propiedad.
for (var counter in jsonData.counters) { console.log(jsonData.counters[counter].counter_name); }
Pero como counters es una matriz, debe usar un bucle for normal:
for (var i=0; i<jsonData.counters.length; i++) { var counter = jsonData.counters[i]; console.log(counter.counter_name); }
fuente
La "forma Sencha" para interactuar con los datos del servidor es configurar un
Ext.data.Store
proxyExt.data.proxy.Proxy
(en este casoExt.data.proxy.Ajax
) provisto de unExt.data.reader.Json
(para datos codificados en JSON, también hay otros lectores disponibles). Para volver a escribir datos en el servidor, existenExt.data.writer.Writer
varios tipos de correos electrónicos .Aquí hay un ejemplo de una configuración como esa:
var store = Ext.create('Ext.data.Store', { fields: [ 'counter_name', 'counter_type', 'counter_unit' ], proxy: { type: 'ajax', url: 'data1.json', reader: { type: 'json', idProperty: 'counter_name', rootProperty: 'counters' } } });
data1.json
en este ejemplo (también disponible en este violín ) contiene sus datos textualmente.idProperty: 'counter_name'
es probablemente opcional en este caso, pero normalmente apunta al atributo de clave principal.rootProperty: 'counters'
especifica qué propiedad contiene una matriz de elementos de datos.Con una configuración de tienda de esta manera, puede volver a leer los datos del servidor llamando
store.load()
. También puede conectar la tienda a cualquier componente de interfaz de usuario apropiado de Sencha Touch, como cuadrículas, listas o formularios.fuente
Algo más pertinente para mí ...
var jsontext = '{"firstname":"Jesper","surname":"Aaberg","phone":["555-0100","555-0120"]}'; var contact = JSON.parse(jsontext); document.write(contact.surname + ", " + contact.firstname); document.write(contact.phone[1]); // Output: // Aaberg, Jesper // 555-0100
fuente
¡Esto funciona como un encanto!
Así que edité el código según mi requisito. Y aquí están los cambios: guardará el número de identificación de la respuesta en la variable de entorno.
var jsonData = JSON.parse(responseBody); for (var i = 0; i < jsonData.data.length; i++) { var counter = jsonData.data[i]; postman.setEnvironmentVariable("schID", counter.id); }
fuente
La respuesta con el voto más alto tiene un error. cuando lo usé lo descubrí en la línea 3:
var counter = jsonData.counters[i];
Lo cambié a:
var counter = jsonData[i].counters;
Y funcionó para mí. Hay una diferencia con las otras respuestas en la línea 3:
var jsonData = JSON.parse(myMessage); for (var i = 0; i < jsonData.counters.length; i++) { var counter = jsonData[i].counters; console.log(counter.counter_name); }
fuente
Solo como un aviso ...
var data = JSON.parse(responseBody);
ha quedado obsoleto .
Postman Learning Center ahora sugiere
var jsonData = pm.response.json();
fuente
Debe utilizar un almacén de datos y un proxy en ExtJs. Hay muchos ejemplos de esto, y el lector JSON analiza automáticamente el mensaje JSON en el modelo que especificó.
No hay necesidad de usar Javascript básico al usar ExtJs, todo es diferente, debe usar las formas de ExtJs para hacer todo bien. Lea la documentación con atención, es buena.
Por cierto, estos ejemplos también son válidos para Sencha Touch (especialmente v2), que se basa en las mismas funciones básicas que ExtJs.
fuente
No estoy seguro de si mis datos coincidían exactamente, pero tenía una matriz de matrices de objetos JSON, que se exportaron desde jQuery FormBuilder al usar páginas.
Espero que mi respuesta pueda ayudar a cualquiera que se encuentre con esta pregunta en busca de una respuesta a un problema similar al que yo tenía.
Los datos se parecían a esto:
var allData = [ [ { "type":"text", "label":"Text Field" }, { "type":"text", "label":"Text Field" } ], [ { "type":"text", "label":"Text Field" }, { "type":"text", "label":"Text Field" } ] ]
Lo que hice para analizar esto fue simplemente hacer lo siguiente:
JSON.parse("["+allData.toString()+"]")
fuente