2010-06-26 6 views
1

J'ai lutté avec celui-ci toute la journée. Dans mon Rails 2.3.5 app, j'ai eu un tas de code personnalisé qui a permis ce qui suit pour se produire:Tweaking Hash # to_json

>> strip_hash_keys_for_json({ "a" => 1 }).to_json 
=> "{ a: 1 }" 

Vous voyez donc que les clés de chaîne ne sont pas cités. Il a été implémenté en créant une classe descendante String qui a renvoyé self de to_json et toutes les clés de hachage ont été enveloppées dans cette classe.

Aujourd'hui, j'ai commencé à mettre à jour l'application vers Rails 3, et elle a cessé de fonctionner, car le contenu de l'encodage JSON avait été réécrit très sérieusement.

Comme vous le savez probablement, dans Rails 3 créer une représentation JSON d'un hachage implique deux méthodes:

  • as_json qui détermine quels sont les éléments du hachage doivent être présents dans JSON
  • encode_json qui en fait des retours une représentation de chaîne contenant le JSON

je me suis dit que je peux changer les choses se passent en observant ce que encode_json fait, et peaufinage des méthodes qui obtiennent c alled à partir de là.

Le problème est que ces deux méthodes ne sont pas appelées du tout. J'ai vérifié toutes les erreurs stupides que j'ai pu commettre dans mes enquêtes et je ne vois rien de mal. Google n'est d'aucune aide aussi, alors je me tourne vers les boursiers SO pour l'assistance.

Merci beaucoup.

MISE À JOUR

OK, donc je compris que pour que ces méthodes de travail, je dois utiliser ActiveSupport::JSON::encode directement au lieu de to_json. Cela semble étrange car Je pensais que {}.to_json est géré par la méthode Object#to_json définie dans ce même fichier encoding.rb, qui à son tour appelle ActiveSupport::JSON.encode(self, options).

Maintenant, je suis totalement confus. Que se passe-t-il lorsque vous supprimez le fichier strip_hash_keys_for_json?

Répondre

0

J'ai ouvert une console et nous avons obtenu:

ruby-1.8.7-p249 > Rails::VERSION::STRING 
=> "2.3.5" 
ruby-1.8.7-p249 > { "a" => 1 }.to_json 
=> "{\"a\":1}" 
+0

ce que vous avez est le comportement standard de 'to_json'. Cependant, mon comportement souhaité est de ne pas citer les clés de chaîne. ai-je énoncé la question de façon peu claire? –

+0

Je vois. J'ai lu l'exemple de code comme le comportement indésirable. –

+0

JSON valide requiert que les clés de chaîne soient entre guillemets. –