2010-07-12 24 views

Respuesta

19

Pruébalo. Si utilizas Ruby on Rails (y las etiquetas dicen que lo eres), creo que este código exacto ya debería funcionar, sin requerir nada.

Rails admite la salida JSON de los controladores, por lo que ya incorpora todo el código de serialización JSON que siempre necesitará. Si usted está planeando para la producción de estos datos a través de un controlador, es posible que pueda ahorrar tiempo escribiendo

render :json => @person 
+0

¿Qué es Person tiene asociaciones? – Sash

+1

Esta respuesta solo se aplica a los proyectos de Rails. ¿Qué pasa con Vanilla Ruby? – cevaris

+1

Diría que ni siquiera se aplica a Rails .. solo se aplica al controlador dentro de una aplicación de rieles .. alcance muy limitado. – baash05

19

Sí, puede hacerlo con to_json.

Es posible que necesite require 'json' si no está utilizando Rails.

+1

Con Rails no es necesario usar 'require 'json'', pero con el código Ruby normal es probable que sea necesario. [JSON es parte de Ruby's Standard Library] (https://ruby-doc.org/stdlib/libdoc/json/rdoc/index.html) por lo que viene con el lenguaje. –

10

Para que su clase Rubí JSON-amigable sin tocar los carriles, que le define dos métodos:

  • to_json, que devuelve un objeto JSON
  • as_json, que devuelve una representación de hash del objeto

cuando el objeto responde adecuadamente a la vez to_json y as_json, puede comportarse correctamente incluso cuando se anida en el interior de otras clases estándar como de la matriz y/o 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" 
           # } 
           # } 

Ver también "Using custom to_json method in nested objects".