mapas diccionarios ruby json serialization jsonserializer

mapas - diccionarios en ruby



Objetos Ruby y serialización JSON(sin Rails) (11)

¿Qué versión de Ruby estás usando? ruby -v te dirá.

Si es 1.9.2, JSON está incluido en la biblioteca estándar .

Si tienes 1.8.algo, gem install json y lo instalará. Entonces, en tu código haz:

require ''rubygems'' require ''json''

A continuación, agregue to_json a un objeto y to_json listo:

asdf = {''a'' => ''b''} #=> {"a"=>"b"} asdf.to_json #=> "{"a":"b"}"

Estoy tratando de entender el panorama de serialización de JSON en Ruby. Soy nuevo para Ruby.

¿Hay alguna buena opción de serialización JSON si no está trabajando con Rails?

Parece que es a donde va esta respuesta (a Rails) Cómo convertir un objeto Ruby a JSON

La gema json parece hacer que parezca que tienes que escribir tu propio método to_json. No he podido llegar a_json para trabajar con matrices y hashes (la documentación dice que funciona con estos). ¿Hay alguna razón por la cual la gema json no solo refleje el objeto y use una estrategia de serialización predeterminada? No es así cómo funciona to_yaml (adivinar aquí)


Desde que busqué mucho para serializar un objeto Ruby a json:

require ''json'' class User attr_accessor :name, :age def initialize(name, age) @name = name @age = age end def as_json(options={}) { name: @name, age: @age } end def to_json(*options) as_json(*options).to_json(*options) end end user = User.new("Foo Bar", 42) puts user.to_json #=> {"name":"Foo Bar","age":42}


Echa un vistazo a Oj . Hay errores cuando se trata de convertir cualquier objeto viejo a JSON, pero Oj puede hacerlo.

require ''oj'' class A def initialize a=[1,2,3], b=''hello'' @a = a @b = b end end a = A.new puts Oj::dump a, :indent => 2

Esto produce:

{ "^o":"A", "a":[ 1, 2, 3 ], "b":"hello" }

Tenga en cuenta que ^o se usa para designar la clase del objeto, y está ahí para ayudar a la deserialización. Para omitir ^o , use :compat modo :compat :

puts Oj::dump a, :indent => 2, :mode => :compat

Salida:

{ "a":[ 1, 2, 3 ], "b":"hello" }



Para obtener la compilación en clases (como Array y Hash) para admitir as_json y to_json , debe require ''json/add/core'' (consulte el readme para obtener más información)


Para que la biblioteca JSON esté disponible, es posible que deba instalar libjson-ruby desde su administrador de paquetes.

Para usar la biblioteca ''json'':

require ''json''

Para convertir un objeto a JSON (estas 3 formas son equivalentes):

JSON.dump object #returns a JSON string JSON.generate object #returns a JSON string object.to_json #returns a JSON string

Para convertir texto JSON a un objeto (estas 2 formas son equivalentes):

JSON.load string #returns an object JSON.parse string #returns an object

Será un poco más difícil para objetos de tus propias clases. Para la siguiente clase, to_json producirá algo como "/"#<A:0xb76e5728>/"" .

class A def initialize a=[1,2,3], b=''hello'' @a = a @b = b end end

Esto probablemente no es deseable. Para serializar eficazmente su objeto como JSON, debe crear su propio método to_json. Para ir con esto, un método de clase from_json sería útil. Podrías extender tu clase así:

class A def to_json {''a'' => @a, ''b'' => @b}.to_json end def self.from_json string data = JSON.load string self.new data[''a''], data[''b''] end end

Puede automatizar esto heredando de una clase ''JSONable'':

class JSONable def to_json hash = {} self.instance_variables.each do |var| hash[var] = self.instance_variable_get var end hash.to_json end def from_json! string JSON.load(string).each do |var, val| self.instance_variable_set var, val end end end

¡Entonces puede usar object.to_json para serializar a JSON y object.from_json! string object.from_json! string para copiar el estado guardado que se guardó como la cadena JSON al objeto.


Si el rendimiento de la representación es crítico, también puede consultar yajl-ruby , que es un enlace a la biblioteca C yajl . La API de serialización para esa se ve así:

require ''yajl'' Yajl::Encoder.encode({"foo" => "bar"}) #=> "{/"foo/":/"bar/"}"


Si está utilizando 1.9.2 o una versión superior, puede convertir hashes y matrices en objetos JSON anidados usando solo to_json.

{a: [1,2,3], b: 4}.to_json

En Rails, puede llamar a_json en objetos Active Record. Puede pasar: incluir y: solo parámetros para controlar el resultado:

@user.to_json only: [:name, :email]

También puede llamar a_json en las relaciones de AR, así:

User.order("id DESC").limit(10).to_json

No necesita importar nada y todo funciona exactamente como espera.


Yo solía virtus . Herramienta realmente poderosa que permite crear una estructura de estructura de Ruby dinámica en función de las clases especificadas. DSL fácil, es posible crear objetos a partir de hash de ruby, hay un modo estricto. Compruébalo.


Jbuilder es una gema construida por la comunidad de rieles. Pero funciona bien en entornos sin rieles y tiene un conjunto genial de características.

# suppose we have a sample object as below sampleObj.name #=> foo sampleObj.last_name #=> bar # using jbuilder we can convert it to json: Jbuilder.encode do |json| json.name sampleObj.name json.last_name sampleObj.last_name end #=> "{:/"name/" => /"foo/", :/"last_name/" => /"bar/"}"


require ''json'' {"foo" => "bar"}.to_json # => "{/"foo/":/"bar/"}"