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"
}
En realidad, hay una gema llamada Jsonable, https://github.com/treeder/jsonable . Es muy dulce
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 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/"}"