Discussion:
JSON.parse me desordena un json
Jordi Villar
2010-10-25 17:40:05 UTC
Permalink
Buenas,

Estoy trabajando con una API, uno de sus campos me devuelve un count
agrupado por meses y ordenado en ascendente. He comprobado la salida en JSON
y es correcto, todo bien ordenado y con los datos correspondientes.

El caso es que cuando hago un JSON.parse response me devuelve el Hash que
toca pero con los meses todos desordenados, ¿sabéis si hay alguna forma de
lograr que no varie el orden? Encuentro un poco cutre reordenarlo, cuando ya
viene ordenado de la API y un parseo no debería alterarlo.

Saludos y gracias.
--
Jordi Villar
[http://jordivillar.com]
javier ramirez
2010-10-25 17:50:35 UTC
Permalink
Hola,
Post by Jordi Villar
El caso es que cuando hago un JSON.parse response me devuelve el Hash
que toca pero con los meses todos desordenados, ¿sabéis si hay alguna
forma de lograr que no varie el orden? Encuentro un poco cutre
reordenarlo, cuando ya viene ordenado de la API y un parseo no debería
alterarlo.
Si lo que te devuelve ese JSON es un object (que se convierte a una Hash
en Ruby) por definición sus componentes no tienen un orden.

El tipo que en JSON tiene orden significativo es un Array.

Lo que está haciendo el parser es correcto. Si se necesitase mantener el
orden el que genera ese JSON debería usar un Array.

saludos,

j
--
javier ramírez

..i do ruby on rails development in madrid, spain, at
http://www.aspgems.com

javier ramirez's home page (http://javier-ramirez.com)
<http://javier-ramirez.com>
javier ramirez's blog (http://formatinternet.com)
<http://formatinternet.com>
Borja Martín
2010-10-25 18:04:42 UTC
Permalink
Buenas,
acabo de hacer una prueba con Yajl-ruby[1] y parece que sí que mantiene el
orden. Ahora bien, no estoy seguro de si es por casualidad, porque así lo
implementa yajl o porque estoy utilizando ruby 1.9.2 donde los hashes sí que
registran el orden en el que se meten los valores:

foo = Yajl::Encoder.encode({:foo => :bar, :bar => :foo, :foobar => :fffuuu})
=> "{\"foo\":\"bar\",\"bar\":\"foo\",\"foobar\":\"fffuuu\"}"

Yajl::Parser.parse(foo, :symbolize_keys => true)
=> {:foo=>"bar", :bar=>"foo", :foobar=>"fffuuu"}


[1]: http://github.com/brianmario/yajl-ruby

Saludos
Post by Jordi Villar
Hola,
El caso es que cuando hago un JSON.parse response me devuelve el Hash que
toca pero con los meses todos desordenados, ¿sabéis si hay alguna forma de
lograr que no varie el orden? Encuentro un poco cutre reordenarlo, cuando ya
viene ordenado de la API y un parseo no debería alterarlo.
Si lo que te devuelve ese JSON es un object (que se convierte a una Hash en
Ruby) por definición sus componentes no tienen un orden.
El tipo que en JSON tiene orden significativo es un Array.
Lo que está haciendo el parser es correcto. Si se necesitase mantener el
orden el que genera ese JSON debería usar un Array.
saludos,
j
--
javier ramírez
..i do ruby on rails development in madrid, spain, at
http://www.aspgems.com
javier ramirez's home page (http://javier-ramirez.com)<http://javier-ramirez.com>
javier ramirez's blog (http://formatinternet.com)<http://formatinternet.com>
_______________________________________________
Proudly free of Ruby Forum crossposting since 01/07/2009
Ror-es mailing list
http://lists.simplelogica.net/mailman/listinfo/ror-es
--
def dagi3d(me)
case me
when :web then "http://dagi3d.net"
when :twitter then "http://twitter.com/dagi3d"
end
end
javier ramirez
2010-10-25 18:27:21 UTC
Permalink
Post by Jordi Villar
Buenas,
acabo de hacer una prueba con Yajl-ruby[1] y parece que sí que
mantiene el orden. Ahora bien, no estoy seguro de si es por
casualidad, porque así lo implementa yajl o porque estoy utilizando
ruby 1.9.2 donde los hashes sí que registran el orden en el que se
Independientemente de lo que haga ruby, en JSON una hash es un objeto
cuyos miembros van desordenados. Depender de que tu parser respete el
orden de esos miembros me parece, cuando menos, arriesgado.

Si el orden es importante, esa API está mal definida y debería devolver
un Array. Si el orden no es importante, entonces no hay problema en como
se está haciendo ahora.

saludos,

j
--
javier ramírez

..i do ruby on rails development in madrid, spain, at
http://www.aspgems.com

javier ramirez's home page (http://javier-ramirez.com)
<http://javier-ramirez.com>
javier ramirez's blog (http://formatinternet.com)
<http://formatinternet.com>
Jordi Villar
2010-10-25 18:49:03 UTC
Permalink
La API la defino yo y pensaba que al devolver la query un OrderedHash este
conservaba las propiedades de orden al ser Ordered y no un simple Hash. Ya
lo he hecho con Array y todo perfecto.

Muchas gracias.
--
Jordi Villar
[http://jordivillar.com]
Post by Jordi Villar
Buenas,
acabo de hacer una prueba con Yajl-ruby[1] y parece que sí que mantiene el
orden. Ahora bien, no estoy seguro de si es por casualidad, porque así lo
implementa yajl o porque estoy utilizando ruby 1.9.2 donde los hashes sí que
Independientemente de lo que haga ruby, en JSON una hash es un objeto cuyos
miembros van desordenados. Depender de que tu parser respete el orden de
esos miembros me parece, cuando menos, arriesgado.
Si el orden es importante, esa API está mal definida y debería devolver un
Array. Si el orden no es importante, entonces no hay problema en como se
está haciendo ahora.
saludos,
j
--
javier ramírez
..i do ruby on rails development in madrid, spain, at
http://www.aspgems.com
javier ramirez's home page (http://javier-ramirez.com)<http://javier-ramirez.com>
javier ramirez's blog (http://formatinternet.com)<http://formatinternet.com>
_______________________________________________
Proudly free of Ruby Forum crossposting since 01/07/2009
Ror-es mailing list
http://lists.simplelogica.net/mailman/listinfo/ror-es
Arnau Sanchez
2010-10-26 12:32:04 UTC
Permalink
Post by Jordi Villar
La API la defino yo y pensaba que al devolver la query un OrderedHash este
conservaba las propiedades de orden al ser Ordered y no un simple Hash. Ya
lo he hecho con Array y todo perfecto.
Si el objeto era conceptualmente un mapping, al enviarlo ahora como Array estás
Post by Jordi Villar
oh
=> #<OrderedHash {:b=>2, :a=>1}>
Post by Jordi Villar
{:keys => oh.keys, :hash => oh}.to_json
=> "{"hash":{"a":1,"b":2},"keys":["a","b"]}"
Borja Martín
2010-10-26 12:27:19 UTC
Permalink
Totalmente de acuerdo. Aunque este parser lo haga de una manera, hay que
atenerse a la especificación del formato con el que estamos trabajando. Algo
similar pasa con los documentos xml, que mucha gente da por hecho que los
nodos parseados deberán aparecer en el mismo en el que aparecen en el
documento cuando realmente no tiene por qué ser así

Saludos
Post by Jordi Villar
Buenas,
acabo de hacer una prueba con Yajl-ruby[1] y parece que sí que mantiene el
orden. Ahora bien, no estoy seguro de si es por casualidad, porque así lo
implementa yajl o porque estoy utilizando ruby 1.9.2 donde los hashes sí que
Independientemente de lo que haga ruby, en JSON una hash es un objeto cuyos
miembros van desordenados. Depender de que tu parser respete el orden de
esos miembros me parece, cuando menos, arriesgado.
Si el orden es importante, esa API está mal definida y debería devolver un
Array. Si el orden no es importante, entonces no hay problema en como se
está haciendo ahora.
saludos,
j
--
javier ramírez
..i do ruby on rails development in madrid, spain, at
http://www.aspgems.com
javier ramirez's home page (http://javier-ramirez.com)<http://javier-ramirez.com>
javier ramirez's blog (http://formatinternet.com)<http://formatinternet.com>
_______________________________________________
Proudly free of Ruby Forum crossposting since 01/07/2009
Ror-es mailing list
http://lists.simplelogica.net/mailman/listinfo/ror-es
--
def dagi3d(me)
case me
when :web then "http://dagi3d.net"
when :twitter then "http://twitter.com/dagi3d"
end
end
Boris Barroso
2010-10-27 15:38:28 UTC
Permalink
Bueno si usas Ruby 1.9.2 no tendras problemas con lo del hash,
lamentablemente no puedo recordar el nombre de la gema que hace que los
hashes puedan ser ordenados ademas de aumentar mas funcionalidad a Ruby
Post by Jordi Villar
Buenas,
Estoy trabajando con una API, uno de sus campos me devuelve un count
agrupado por meses y ordenado en ascendente. He comprobado la salida en JSON
y es correcto, todo bien ordenado y con los datos correspondientes.
El caso es que cuando hago un JSON.parse response me devuelve el Hash que
toca pero con los meses todos desordenados, ¿sabéis si hay alguna forma de
lograr que no varie el orden? Encuentro un poco cutre reordenarlo, cuando ya
viene ordenado de la API y un parseo no debería alterarlo.
Saludos y gracias.
--
Jordi Villar
[http://jordivillar.com]
_______________________________________________
Proudly free of Ruby Forum crossposting since 01/07/2009
Ror-es mailing list
http://lists.simplelogica.net/mailman/listinfo/ror-es
--
Boris Barroso
Loading...