2013-02-03 2 views
1

J'ai remarqué que la sortie Rails JSON est triée par ordre alphabétique.Quel composant est le tri des valeurs JSON dans la réponse Rails JSON et pourquoi?

Ceci est un exemple de sortie JSON à partir d'une application Rails de base:

{"created_at":"2013-02-03T19:44:39Z","email":"[email protected]","id":2,"name":"Mohsen","updated_at":"2013-02-03T19:44:39Z"} 

Il semble created_at et updated_at ont même origine et devrait venir à côté de l'autre probablement. Mais la sortie Rails est triée par ordre alphabétique.

Quel composant fait ce travail et pourquoi?

+0

Est-ce à cause de 'OrderedHash' ou parce que vous utilisez ruby ​​<1.9? Je ne suis pas sûr de ce qui se passe mais voici la source pour l'encodage JSON Rails. https://github.com/mateusg/docrails_pt-BR/blob/master/activesupport/lib/active_support/json/encoding.rb –

+0

Utilisez-vous ruby ​​1.9? –

Répondre

3

Je trouve que la première ligne de ActiveModel::Serializers::JSON#as_json appelle ActiveModel::Serialization#serializable_hash, qui a this line of code that sorts the attribute names:

attribute_names = attributes.keys.sort 

C'est là que les attributs sont triés. Quant à pourquoi ils sont triés, la réponse est moins claire. Josh Peek introduced the sort in this commit way back in July of 2009, mais le commentaire de validation était simplement "Intégrer AMo JSON sérialiseur dans AR." Il n'a pas dit pourquoi il a ajouté l'appel à .sort.

Mais si vous n'aimez pas le tri, vous avez de la chance aussi longtemps que vous êtes prêt à passer à Rails 4 quand il sortira. L'équipe principale de Rails semble être d'accord sur le fait que les clés JSON ne doivent pas être triées. In March of 2012 they accepted this pull request in which the call to sort was removed. Ce commit n'est pas dans le dernier Rails 3.2 mais sera dans Rails 4, qui arrive bientôt.