Développeur Web RoR

Aller au contenu | Aller au menu | Aller à la recherche

jeudi 8 septembre 2011

Rubyonrails to_json inclure exclure et appels de méthode

La sérialisation en json est bien pratique pour faire des API, en effet le json est beaucoup moins verbeux que le xml. De plus avec Rails 3.1 les exports ne se font plus avec xml mais json par défaut. Voici un post-it :

konata = User.find(1)
konata.to_json
# => {"id": 1, "name": "Konata Izumi", "age": 16,
"created_at": "2006/08/01", "awesome": true}

Les options :only et :except peuvent être utilisé pour limiter les attributs des models lors de la sérialization json. Par exemple :


  konata.to_json(:only => [ :id, :name ])
# => {"id": 1, "name": "Konata Izumi"}
konata.to_json(:except => [ :id, :created_at, :age ])
# => {"name": "Konata Izumi", "awesome": true}

Pour include des méthodes sur des models, utilisez :methods.


  konata.to_json(:methods => :permalink)
# => {"id": 1, "name": "Konata Izumi", "age": 16,
"created_at": "2006/08/01", "awesome": true,
"permalink": "1-konata-izumi"}

Pour inclure une association, utilisez :include.


  konata.to_json(:include => :posts)
# => {"id": 1, "name": "Konata Izumi", "age": 16,
"created_at": "2006/08/01", "awesome": true,
"posts": [{"id": 1, "author_id": 1, "title": "Welcome to the weblog"},
{"id": 2, author_id: 1, "title": "So I was thinking"}]}

Plusieurs niveaux d'association peuvent être géré par to_json :


  konata.to_json(:include => { :posts => {
:include => { :comments => {
:only => :body } },
:only => :title } })
# => {"id": 1, "name": "Konata Izumi", "age": 16,
"created_at": "2006/08/01", "awesome": true,
"posts": [{"comments": [{"body": "1st post!"}, {"body": "Second!"}],
"title": "Welcome to the weblog"},
{"comments": [{"body": "Don't think too hard"}],
"title": "So I was thinking"}]}
Intégralement pompé mais traduit à partir de http://apidock.com/rails/ActiveRecord/Serialization/to_json

mercredi 23 mars 2011

to_json : inclure (include) des sous models et des méthodes dans la serialisation

Bon le to_json c'est cool mais il vous manque des informations dans votre sérialisation ? Pas de soucis il existe des options à to_json :

:include => :model_a_inclure(s) ou pour une méthode :methods => :ma_method

Par exemple si vous voulez sérialiser un product avec sa famille (product belongs_to family, family has_many products):

Product.find(1).to_json(:include => :family)

Si vous voulez sérialiser une famille avec ses products :

Family.first.to_json(:include => :products)

Ici to_json ne permet pas de faire des filtres sur les données (j'entends certains produits dans notre cas, il est possible de filtrer les champs voir en bas de l'article)

La méthode que j'ai utilisé pour filtrer les models :

Un scope dans produit qui ne récupère que les produits visibles :

scope, :visible, where(:visible => true)

Puis dans family, j'ajoute une méthode qui récupère ses produits visibles et les sérialisent.

def visible_products

   return JSON.parse(self.products.visible.to_json)

end

Enfin pour sérialiser, la méthode va appeler visible_products sur family :

Family.first.to_json(:methods => :visible_products)

(Voir l'article précédent pour le pretty print du JSON)

Enfin il est possible via :only et :except de virer des champs lors de la sérialisation.

Pour plus d'info la doc complete : http://ar.rubyonrails.org/classes/ActiveRecord/Serialization.html#M000049

Pretty Printer du json en rails console (rubyonrails 3)

Voici deux fonctions qui permettent d'afficher du JSON joliement. Elles nécessitent le gem json donc dans le Gemfile :

gem 'json', '>= 1.2.0'

Donc ensuite : 

bundle install

Ensuite pour pouvez en faire des helpers ou les mettre dans un fichier dans Rails.root/lib. Donc les voici

pjson renvoie du pretty JSON, et ppjson affiche du pretty JSON ! "str" est une chaine de caractère JSON

def pjson(str)
  return JSON.pretty_generate(JSON.parse(str))
end
def ppjson(str)
  puts JSON.pretty_generate(JSON.parse(str))
end

jeudi 24 décembre 2009

RubyOnRails - Parser une chaine JSON - Erreur Invalid JSON string

json

Pour parser du JSON deux méthodes :

Utiliser les composants de base de rubyonrails :

mon_hash = ActiveSupport::JSON.decode(ma_chaine_json)

Cette manière de faire est moins performante et risque certainement de se terminer par un message d'erreur "Invalid JSON string" (à cause de tout un tas de choses mal géré : guillemets qui se suivent, caractères échappés, etc...)

L'autre manière est d'installer le gem json :

sudo gem install json

Dans environment.rb config.gem "json"

Enfin pour l'utilisation: mon_hash = JSON.parse(ma_chaine_json)

Cette méthode est 10 fois plus rapide et se termine avec succès pourvu que votre chaine JSON soit effectivement juste !