Menú Principal

Alguien tiene idea de Json?

Iniciado por yonnon, Julio 20, 2011, 02:12:31 PM

Tema anterior - Siguiente tema

yonnon

Pues eso, que tengo problemas para parsear un objeto Json (no tengo ni idea de como acceder a objetos del mismo que no tienen nombre.

Me explico con un ejemplo. Lo normal seria tener

["a": "valor de a", "b": {"b1": "valor de b1", "listadeb2": [ {...} , {... }], }, "c": "valordec", "d": "valorded"]


Mi problema es que los datos me llegan en JSON valido peeeero:

["a", {"b1": "valor de b1", "listadeb2": [ {...} , {... }], }, {"c": "valordec", "d": "valorded"}]

es decir, "a" sin valor (no me preocupa) pero el objeto b me viene sin nombre y los dos ultimos valores c y d me vienen tambien empaquetados en un unico objeto sin nombre (estos tampoco me preocupan).

Mi objeto json es un String + un objeto + otro objeto, pero como los objetos no tienen nombre no se acceder a ellos by name. No se si se puede acceder mediante indices o como leches sea.

algo asi como:

myJsonObject.Objects[index].b1
o
myJsonObject.Objects[index].listadeb2[index].eltipodevariablequetoque


espero haberme explicado




Baku

#1
¿Con que lenguaje lo quieres parsear?

Por ejemplo:

http://code.google.com/p/json-sans-eval/

Aquí­ tienes para todos los que se te puedan ocurrir:

http://www.json.org/
It's very difficult todo esto.

yonnon

Cita de: Baku en Julio 20, 2011, 02:39:41 PM
¿Con que lenguaje lo quieres parsear?

Por ejemplo:

http://code.google.com/p/json-sans-eval/

Aquí­ tienes para todos los que se te puedan ocurrir:

http://www.json.org/

Si, ya me he pasado por todos esos sitios y mas.
De momento, con jscript.


Directamente con el parser incluido en Explorer (de las ultimas versiones, de momento para ver que todo funciona OK) porque en Firefox tengo errores.

Es decir, hasta ahora recibo sin problemas un porron de datos que es una ristra Json valida(es lo que me devuelve una peticion a una pagina concreta) y lo puedo mostrar "a pelo" como texto mediante Ajax, pero no consigo parsearlo para presentarlo elegantemente por lo que he comentado, no hay "nombre" para algunos de los objetos que incluye y no se acceder a ellos.

Curiosamente si incluyo otro parser (json-sans-eval.js) en mi codigo, me da error del mismo.
El ejemplo de la pagina de este parser  funciona perfectamente con el parser que viene de serie en Explorer (no es necesario incluir json-sans-eval.js)

Este es el ejemplo:

var myJson = '{ "x": "Hello, World!", "y": [1, 2, 3] }';
var myJsonObj = jsonParse(myJson);
alert(myJsonObj.x);  // alerts Hello, World!
for (var k in myJsonObj) {
  // alerts x=Hello, World!  and  y=1,2,3
  alert(k + '=' + myJsonObj[k]);
}

Mi "problema" es que mi Objecto Json a tratar es '{ "x", [1, 2, 3] }'

y a su vez, 1,2 y 3 son a su vez mas objetos y no consigo "dar con ellos".

yonnon


Bestiajez


Bestiajez

De todas formas... ¿Es una acción de Struts la que te está pasando el chorizo? ¿Puedes tocar el código en el servidor?

yonnon

Cita de: Bestiajez en Julio 22, 2011, 01:37:53 PM
De todas formas... ¿Es una acción de Struts la que te está pasando el chorizo? ¿Puedes tocar el código en el servidor?


No, no puedo tocar nada del servidor, no es "mio".  Es un servicio que "me ofrecen". Se a que pagina llamar y con que parametros. Vamos,  un get mas ristra de parametros. Me devuelven una ristra de datos en JSON y con eso me estoy peleando. Que de momento me funciona bien dandole con jscript y explorer (su parser json integrado me funciona bien). Con Firefox tengo problemas, pero he leido por algun lado que cada navegador lleva un prser de JSON de su madre (si es que lleva) y que mejor tirar de librerias externas.   

Lo mas probable es que haga una version pura y dura en java cuando no tenga prisa y que me deje los datos en POJOS para meterlos en tablas, porque ahora a los usuarios les doy un html que cortan y pegan en excel y ellos tan contentos.

Bestiajez

Cita de: Mr Calamardo en Julio 22, 2011, 02:21:15 PM
Cita de: Bestiajez en Julio 22, 2011, 01:37:53 PM
De todas formas... ¿Es una acción de Struts la que te está pasando el chorizo? ¿Puedes tocar el código en el servidor?


No, no puedo tocar nada del servidor, no es "mio".  Es un servicio que "me ofrecen". Se a que pagina llamar y con que parametros. Vamos,  un get mas ristra de parametros. Me devuelven una ristra de datos en JSON y con eso me estoy peleando. Que de momento me funciona bien dandole con jscript y explorer (su parser json integrado me funciona bien). Con Firefox tengo problemas, pero he leido por algun lado que cada navegador lleva un prser de JSON de su madre (si es que lleva) y que mejor tirar de librerias externas.   

Lo mas probable es que haga una version pura y dura en java cuando no tenga prisa y que me deje los datos en POJOS para meterlos en tablas, porque ahora a los usuarios les doy un html que cortan y pegan en excel y ellos tan contentos.

Bueno, por si te sirve de algo:

En el lado del servidor y asumiendo que se trate de una aplicación J2EE con Struts, en el fichero de configuración struts.xml (o quizás con otro nombre) debe de estar registrada la acción que esta asociada a tu petición.

Allí­ debe de estar configurada la cosa como algo parecido a esto:


      <action name="[nombre de la acción]" class="com.dominio.blablabla.TuClase">
                                       [...]
         <result name="success" type="JSON"></result>
                                       [...]
      </action>   

El plugin JSON de Struts se encarga de serializar el grafo que devuelve la clase TuClase en un chorizo JSON. Esto es, la clase devuelve una serie de objetos conectados con otros y el plugin los lee y escribe una salida JSON conteniendo los datos. Si te vas a la clase (com.dominio.blablabla.TuClase) puedes ver que objeto te está devolviendo y su estructura.


Volviendo a tus ejemplos:

["a": "valor de a", "b": {"b1": "valor de b1", "listadeb2": [ {...} , {... }], }, "c": "valordec", "d": "valorded"]

["a", {"b1": "valor de b1", "listadeb2": [ {...} , {... }], }, {"c": "valordec", "d": "valorded"}]


No los entiendo. Has intercambiado llaves y corchetes o has quitado algunos o te has liado copiando ¿no?




















yonnon

Cita de: Bestiajez en Julio 22, 2011, 03:34:10 PM
Cita de: Mr Calamardo en Julio 22, 2011, 02:21:15 PM
Cita de: Bestiajez en Julio 22, 2011, 01:37:53 PM
De todas formas... ¿Es una acción de Struts la que te está pasando el chorizo? ¿Puedes tocar el código en el servidor?


No, no puedo tocar nada del servidor, no es "mio".  Es un servicio que "me ofrecen". Se a que pagina llamar y con que parametros. Vamos,  un get mas ristra de parametros. Me devuelven una ristra de datos en JSON y con eso me estoy peleando. Que de momento me funciona bien dandole con jscript y explorer (su parser json integrado me funciona bien). Con Firefox tengo problemas, pero he leido por algun lado que cada navegador lleva un prser de JSON de su madre (si es que lleva) y que mejor tirar de librerias externas.   

Lo mas probable es que haga una version pura y dura en java cuando no tenga prisa y que me deje los datos en POJOS para meterlos en tablas, porque ahora a los usuarios les doy un html que cortan y pegan en excel y ellos tan contentos.

Bueno, por si te sirve de algo:

En el lado del servidor y asumiendo que se trate de una aplicación J2EE con Struts, en el fichero de configuración struts.xml (o quizás con otro nombre) debe de estar registrada la acción que esta asociada a tu petición.

Allí­ debe de estar configurada la cosa como algo parecido a esto:


      <action name="[nombre de la acción]" class="com.dominio.blablabla.TuClase">
                                       [...]
         <result name="success" type="JSON"></result>
                                       [...]
      </action>   

El plugin JSON de Struts se encarga de serializar el grafo que devuelve la clase TuClase en un chorizo JSON. Esto es, la clase devuelve una serie de objetos conectados con otros y el plugin los lee y escribe una salida JSON conteniendo los datos. Si te vas a la clase (com.dominio.blablabla.TuClase) puedes ver que objeto te está devolviendo y su estructura.


Volviendo a tus ejemplos:

["a": "valor de a", "b": {"b1": "valor de b1", "listadeb2": [ {...} , {... }], }, "c": "valordec", "d": "valorded"]

["a", {"b1": "valor de b1", "listadeb2": [ {...} , {... }], }, {"c": "valordec", "d": "valorded"}]


No los entiendo. Has intercambiado llaves y corchetes o has quitado algunos o te has liado copiando ¿no?


["a", {"b1": "valor de b1", "listadeb2": [ {...} , {... }], }, {"c": "valordec", "d": "valorded"}]

No, no, en absoluto. Mi ejemplo es el anterior: el parametro "a" no tiene ningun valor y el siguiente valor, es un objeto que no tiene nombre, de ahi que empiece directamente con la llave y no como nombredeobjeto:valor.  Aun asi, los validadores web me dicen que es un "chorro" JSON valido. Yo pensaba que era obligatorio que siempre existiera el par nombredeobjetoovariable:valor.
De todos modos mi problema era no saber referenciar los objetos del chorro devuelto. al final he comprobado que los objetos los dereferencia via indice numerico y los objetos simples (strings, ints, etc) los dereferencia via nombre de variable.

Bestiajez

Tiene sentido que existan valores sin clave dentro de un array. En java por ej.

Object[] o = new Object[]{"Soy un string", new ArrayList(<una colección cualquiera con elem1, elem2 y elem3>)}

El array de objetos de arriba se representarí­a en JSON así­n

["Soy un String", {elem1, elem2, elem3}]


Los pares clave-valor se corresponden con atributos en un objeto pero repito, tus cadenas JSON son arrays. Empiezan con corchetes, no con llaves.

Esto es, en tu ejemplo:

["a", {"b1": "valor de b1", "listadeb2": [ {...} , {... }], }, {"c": "valordec", "d": "valorded"}]

Es un array que contiene un String con el valor "a" (no es la clave, es el valor) y luego el objeto con sus atributos, aquí­ si tienes pares clave-valor que son el nombre del atributo en el objeto y su valor (que puede ser otro objeto o un array, etc...).








yonnon

Cita de: Bestiajez en Julio 23, 2011, 08:33:04 PM
Tiene sentido que existan valores sin clave dentro de un array. En java por ej.

Object[] o = new Object[]{"Soy un string", new ArrayList(<una colección cualquiera con elem1, elem2 y elem3>)}

El array de objetos de arriba se representarí­a en JSON así­n

["Soy un String", {elem1, elem2, elem3}]


Los pares clave-valor se corresponden con atributos en un objeto pero repito, tus cadenas JSON son arrays. Empiezan con corchetes, no con llaves.

Esto es, en tu ejemplo:

["a", {"b1": "valor de b1", "listadeb2": [ {...} , {... }], }, {"c": "valordec", "d": "valorded"}]

Es un array que contiene un String con el valor "a" (no es la clave, es el valor) y luego el objeto con sus atributos, aquí­ si tienes pares clave-valor que son el nombre del atributo en el objeto y su valor (que puede ser otro objeto o un array, etc...).




ok a la negrita. En el caso de ese par variable-valor me da igual porque no lo necesito: No caia en que fuera precisamente el valor de una variable anonima, aunque accedo a ella sin problema via indice:

miobjetojasondevuelto[0]

(miobjetojasondevuelto es un objeto devuelto por el parser de json del navegador a partir del chorro de datos devueltos por el servicio)

a partir de aqui, mediante indices anidados ya voy recuperando el resto de variables, pero lo hago mediante combinaciones de nombre de variable y indice, por ejemplo

miobjetojasondevuelto[1]['elementlist'][0]['primeravariable']

me devuelve el valor de la primera variable (de nombre 'primeravariable') del primer elemento (indizado por
  • )  de un array (de nombre 'elementlist') que forma parte del segundo objeto jason (indizado por [1]) (aqui conozco el nombre del array: 'elementlist' y de las variables que lo forman 'primeravariable', 'segundavariable', etc

    Mi duda actual es: ¿es posible recuperar un valor de una variable sin conocer el nombre de la misma?
    Es decir, si no conozco realmente el nombre de, por ejemplo, 'primeravariable', puedo acceder a ella via indice? Por ejemplo asi:

    miobjetojasondevuelto[1]['elementlist'][0]
    • [/b]

      ¿Hay algun metodo que me de el nombre de dicha variable?

      Algo tipo:

      miobjetojasondevuelto[1]['elementlist'][0][0].getName()

      o similar?

      o incluso el par variable:valor

      miobjetojasondevuelto[1]['elementlist'][0][0].getNameAndValue()

      vamos, resumiendo, la doc de la Api del parser de JSON de explorer esta "en alguna parte"?






      a los otros, accedo


      Si forzaba la salida via alert obtenia

      "a", [object][object]

Bestiajez

#11
Cita de: Mr Calamardo en Julio 24, 2011, 12:58:18 PM
Cita de: Bestiajez en Julio 23, 2011, 08:33:04 PM
Tiene sentido que existan valores sin clave dentro de un array. En java por ej.

Object[] o = new Object[]{"Soy un string", new ArrayList(<una colección cualquiera con elem1, elem2 y elem3>)}

El array de objetos de arriba se representarí­a en JSON así­n

["Soy un String", {elem1, elem2, elem3}]


Los pares clave-valor se corresponden con atributos en un objeto pero repito, tus cadenas JSON son arrays. Empiezan con corchetes, no con llaves.

Esto es, en tu ejemplo:

["a", {"b1": "valor de b1", "listadeb2": [ {...} , {... }], }, {"c": "valordec", "d": "valorded"}]

Es un array que contiene un String con el valor "a" (no es la clave, es el valor) y luego el objeto con sus atributos, aquí­ si tienes pares clave-valor que son el nombre del atributo en el objeto y su valor (que puede ser otro objeto o un array, etc...).


ok a la negrita. En el caso de ese par variable-valor me da igual porque no lo necesito: No caia en que fuera precisamente el valor de una variable anonima, aunque accedo a ella sin problema via indice:

miobjetojasondevuelto[0]


¿De que otra forma esperabas acceder a un elemento de un array si no es referenciandolo con su í­ndice?


Cita de: Mr Calamardo en Julio 24, 2011, 12:58:18 PM

(miobjetojasondevuelto es un objeto devuelto por el parser de json del navegador a partir del chorro de datos devueltos por el servicio)

a partir de aqui, mediante indices anidados ya voy recuperando el resto de variables, pero lo hago mediante combinaciones de nombre de variable y indice, por ejemplo

miobjetojasondevuelto[1]['elementlist'][0]['primeravariable']


Claro, unas veces son arrays, otras veces son objetos simples. Si quieres obtener un elemento especí­fico de un array, tienes que usar el í­ndice. Si ya sabes que objeto te está devolviendo y conoces sus atributos, lo lógico es preguntar al objeto por el atributo en cuestión.

Cita de: Mr Calamardo en Julio 24, 2011, 12:58:18 PM
me devuelve el valor de la primera variable (de nombre 'primeravariable') del primer elemento (indizado por
  • )  de un array (de nombre 'elementlist') que forma parte del segundo objeto jason (indizado por [1]) (aqui conozco el nombre del array: 'elementlist' y de las variables que lo forman 'primeravariable', 'segundavariable', etc

    Mi duda actual es: ¿es posible recuperar un valor de una variable sin conocer el nombre de la misma?
    Es decir, si no conozco realmente el nombre de, por ejemplo, 'primeravariable', puedo acceder a ella via indice? Por ejemplo asi:

    miobjetojasondevuelto[1]['elementlist'][0]
    • [/b]

Creo que ahora estás mezclando un poco lo que es un objeto JS con los formularios en el objeto DOM. Puede que si, que puedas referenciar el valor de los atributos en un objeto JS mediante el í­ndice en versiones antiguas de JS ... No se si puedes seguir haciéndolo ahora y aunque puedas y el intérprete no proteste, me parece que el problema es que nadie te asegura el orden que va a ocupar el atributo que quieres.


Cita de: Mr Calamardo en Julio 24, 2011, 12:58:18 PM

¿Hay algun metodo que me de el nombre de dicha variable?

Algo tipo:

miobjetojasondevuelto[1]['elementlist'][0][0].getName()



Uhhh... No. Eso no tendrí­a sentido. Estás pidiéndole al valor te diga cuál es el nombre de su clave... Asumiendo por tu cara bonita que es un objeto que tiene un método que te la proporciona. Podrí­a ser un número o cualquier cosa.



Cita de: Mr Calamardo en Julio 24, 2011, 12:58:18 PM

o similar?

o incluso el par variable:valor

miobjetojasondevuelto[1]['elementlist'][0][0].getNameAndValue()

vamos, resumiendo, la doc de la Api del parser de JSON de explorer esta "en alguna parte"?


Nop. Asumiendo que

miobjetojasondevuelto[1]['elementlist'][0][0]

te funcione, te estarí­a devolviendo directamente el objeto contenido en el primer atributo de la lista, no una especie de objeto wrapper que contiene clave y valor y métodos de conveniencia para acceder a ellos.

Cita de: Mr Calamardo en Julio 24, 2011, 12:58:18 PM

a los otros, accedo


Si forzaba la salida via alert obtenia

"a", [object][object]



A ver

miobjetojasondevuelto[1]['elementlist'][0]['primeravariable']

Tu dices:

me devuelve el valor de la primera variable (de nombre 'primeravariable') del primer elemento (indizado por
)  de un array (de nombre 'elementlist') que forma parte del segundo objeto jason (indizado por [1]) (aqui conozco el nombre del array: 'elementlist' y de las variables que lo forman 'primeravariable', 'segundavariable', etc


vamos a verlo al revés:

Dame el segundo objeto contenido en el array "miobjetojasondevuelto" (En el array, todos los elementos son anónimos)
Una vez lo tengas, dame el contenido de su atributo "elementlist"
El contenido de "elementlist" resulta que es otro array, así­ que dame el primer objeto de la lista
Ahora dame el contenido del atributo "primeravariable" de ese objeto.

Al parecer tu quieres poder leer el contenido de "primeravariable" sin usar el literal "primeravariable"... Podemos movernos un poco más hacia arriba y me puedes explicar por qué no quieres/puedes usar el nombre del atributo?


yonnon

#12
Cita de: Bestiajez en Julio 24, 2011, 02:10:01 PM


A ver

miobjetojasondevuelto[1]['elementlist'][0]['primeravariable']

Tu dices:

me devuelve el valor de la primera variable (de nombre 'primeravariable') del primer elemento (indizado por
)  de un array (de nombre 'elementlist') que forma parte del segundo objeto jason (indizado por [1]) (aqui conozco el nombre del array: 'elementlist' y de las variables que lo forman 'primeravariable', 'segundavariable', etc


vamos a verlo al revés:

Dame el segundo objeto contenido en el array "miobjetojasondevuelto" (En el array, todos los elementos son anónimos)
Una vez lo tengas, dame el contenido de su atributo "elementlist"
El contenido de "elementlist" resulta que es otro array, así­ que dame el primer objeto de la lista
Ahora dame el contenido del atributo "primeravariable" de ese objeto.

Al parecer tu quieres poder leer el contenido de "primeravariable" sin usar el literal "primeravariable"... Podemos movernos un poco más hacia arriba y me puedes explicar por qué no quieres/puedes usar el nombre del atributo?



Por lo que explicas antes (no cito mas porque estoy con un portatil que no es mio y sin raton y me cuesta manejarme con el para seleccionar-cortar-copiar, etc), entiendo ahora por que recibo ya inicialmente un objeto de un array

Citar... pero repito, tus cadenas JSON son arrays

el servicio que me da los resultados es una consulta que puede tener muchos registros, asi que ellos los empaquetan de 20 en 20 en arrays y solo me envian un array con 20 objetos mas la info adicional para saber que "numero de pagina" o "array suyo" me han enviado y cuantas "paginas" (o arrays suyos) puedo pedir en sucesivas peticiones GET (el parametro numPage lo emplean ellos para enviarme el paquete de 20 que toque.


A la negrita, lo preguntaba porque no estaba seguro de si era la forma mas correcta de hacerlo (realmente accedo por el nombre de la variable, la clave o atributo o como quieras llamarlo). Pero esta claro que esta bien  (como has dicho antes, es lo mejor porque asi es indepeniente del orden en que te envien los pares atributo-valor).

Gracias, me has aclarado bastantes conceptos.
(es que el puñetero JSON no lo habia tocado nunca, y el DOM model y JSCRIPT los tengo muy oxidados)