2012-11-05 3 views
2

Lorsque j'obtiens un tableau d'objets dans la réponse JSON, ils peuvent être représentés dans un ordre différent.Compare la réponse json avec un tableau de hachages

Parfois, je reçois ce

JSON.parse(response.body) # => [{"a" => "b"}, {"c" => "d"}] 

ou cette

JSON.parse(response.body) # => [{"c" => "d"}, {"a" => "b"}] 

Mais pour moi les résultats sont corrects. Quel est le moyen le plus simple de tester quels objets j'ai en réponse quel que soit leur ordre?

+1

duplication possible de [Comparer les hachis ruby] (http://stackoverflow.com/questions/1766741/comparing-ruby-hashes) –

+0

Voulez-vous comparer les deux ou voulez-vous juste vérifier l'existence de certains clés? –

+0

@padde, je veux comparer deux hachages ou plus dans le tableau. Mais je ne veux pas comparer leur ordre dans le tableau. –

Répondre

3

Vous pouvez le convertir en une structure en forme d'ensemble en utilisant un hachage.

first_response.inject({}){|s, h| s[h] = true; s} 

sera le même que

second_response.inject({}){|s, h| s[h] = true; s} 
2

Avec ses autres fonctionnalités utiles, le joyau json spec a un matcher be_json_eql qui fonctionne sans respect à l'ordre.

+0

Je ne suis pas sûr que 'be_json_eql' soit indépendant de l'ordre . Le code ressemble à '@actual, @expected = scrub (actual_json, @path), scrub (@expected_json)', puis fait un '@actual == @ expected'. la méthode 'scrub' est chargée d'exclure les clés dont vous ne voulez pas faire partie (par exemple' updated_at'), et de 'normaliser' le JSON, qui appelle simplement 'JSON.pretty_generate' ou 'to_json'. – chug2k

Questions connexes