2010-07-12 4 views

Répondre

19

Essayez-le. Si vous utilisez Ruby on Rails (et les tags disent que vous êtes), je pense que ce code exact devrait déjà fonctionner, sans rien exiger. Rails prend en charge la sortie JSON des contrôleurs. Il prend donc en charge tout le code de sérialisation JSON dont vous aurez besoin. Si vous envisagez de sortie de ces données par un contrôleur, vous pourriez être en mesure de gagner du temps en écrivant simplement

render :json => @person 
+0

Qu'est-ce que la personne a des associations? – Sash

+1

Cette réponse ne s'applique qu'aux projets Rails. Qu'en est-il de la vanille Ruby? – cevaris

+1

Je dirais qu'il ne s'applique même pas à Rails .. il ne s'applique qu'au contrôleur dans une application rails ... portée très limitée. – baash05

19

Oui, vous pouvez le faire avec to_json.

Vous devrez peut-être require 'json' si vous n'exécutez pas Rails.

+1

Avec Rails, il n'est pas nécessaire d'utiliser 'require 'json'', mais avec un code Ruby régulier, cela sera probablement nécessaire. [JSON fait partie de la bibliothèque standard de Ruby] (https://ruby-doc.org/stdlib/libdoc/json/rdoc/index.html) donc il vient avec la langue. –

10

Pour rendre votre classe Ruby JSON-friendly sans toucher Rails, vous souhaitez définir deux méthodes:

  • to_json, qui retourne un objet JSON
  • as_json, qui retourne une représentation de hachage de l'objet

lorsque votre objet répond correctement à la fois to_json et as_json, il peut se comporter correctement, même quand il est niché au plus profond d'autres classes standard comme matrice et/ou Hash:

#!/usr/bin/env ruby 

require 'json' 

class Person 

    attr_accessor :fname, :lname 

    def as_json(options={}) 
     { 
      fname: @fname, 
      lname: @lname 
     } 
    end 

    def to_json(*options) 
     as_json(*options).to_json(*options) 
    end 

end 

p = Person.new 
p.fname = "Mike" 
p.lname = "Smith" 

# case 1 
puts p.to_json     # output: {"fname":"Mike","lname":"Smith"} 

# case 2 
puts [p].to_json    # output: [{"fname":"Mike","lname":"Smith"}] 

# case 3 
h = {:some_key => p} 
puts h.to_json     # output: {"some_key":{"fname":"Mike","lname":"Smith"}} 

puts JSON.pretty_generate(h) # output 
           # { 
           # "some_key": { 
           #  "fname": "Mike", 
           #  "lname": "Smith" 
           # } 
           # } 

Voir aussi "Using custom to_json method in nested objects".

Questions connexes