Como converter um objeto de hash ruby ​​para JSON?

340

Como converter um objeto de hash ruby ​​para JSON? Então, eu estou tentando este exemplo abaixo e ele não funciona?

Eu estava olhando para o RubyDoc e, obviamente, o Hashobjeto não tem um to_jsonmétodo. Mas estou lendo em blogs que o Rails suporta active_record.to_jsone também suporta hash#to_json. Eu posso entender que ActiveRecordé um objeto Rails, mas Hashnão é nativo do Rails, é um objeto Ruby puro. Então no Rails você pode fazer um hash.to_json, mas não em Ruby puro?

car = {:make => "bmw", :year => "2003"}
car.to_json
kapso
fonte

Respostas:

563

Uma das inúmeras gentilezas do Ruby é a possibilidade de estender as classes existentes com seus próprios métodos. Isso é chamado de "reabertura de classe" ou remendo de macacos ( embora o significado desta última possa variar ).

Então, dê uma olhada aqui:

car = {:make => "bmw", :year => "2003"}
# => {:make=>"bmw", :year=>"2003"}
car.to_json
# NoMethodError: undefined method `to_json' for {:make=>"bmw", :year=>"2003"}:Hash
#   from (irb):11
#   from /usr/bin/irb:12:in `<main>'
require 'json'
# => true
car.to_json
# => "{"make":"bmw","year":"2003"}"

Como você pode ver, a exigência jsontrouxe magicamente o método to_jsonpara o nosso Hash.

Mladen Jablanović
fonte
2
tudo o que posso dizer é uau :) também muito obrigado !! Então, basicamente, eu era capaz de estender a classe json dinamicamente?
kapso
11
Eu tentei a mesma coisa com o objeto Ruby e ele não funciona? >> require 'json' => true >> class Person >> attr_accessor: fname,: lname >> end => nil >> p = Person.new => # <Person: 0x101155f70> >> p.fname = "Bill "=>" Bill ">> p.lname =" Shine "=>" Shine ">> p.to_json =>" \ "# <Pessoa: 0x101155f70> \" "
kapso 06/07/10
10
Não, não, alguém precisa codificar como o objeto de uma classe arbitrária deve ser serializado para JSON. Eles fizeram isso Hashe Arrayaulas de jsongema, mas a sua turma Personé simples Object. Mas você pode herdar Hash. Você pode abrir uma nova pergunta se não conseguir.
Mladen Jablanović
obrigado. aqui está a nova pergunta, qualquer ajuda seria apreciada. Obrigado. stackoverflow.com/questions/3226054/…
kapso
Você está mostrando o que parece ser uma saída do tipo IRB. Eu estava tentando fazer com que o hash # to_json funcionasse para o objeto DateTime. Graças a este post eu consegui. Mas inspecionei com p date_json Isto é o que recebi para uma string verdadeira "{\" year \ ": 2013, \" mon \ ": 7, \" mday \ ": 16, \" hour \ ": 13, \ "min \": 54, \ "sec \": 32, \ "zone \": \ "- 05:00 \", \ "offset \": - 18000} "para que você possa ver que está fazendo o símbolos-chave como strings e, é claro, que os dados não são alterados. Obrigado novamente. Desculpe, estou tão atrasado.
Douglas G. Allen
19
require 'json/ext' # to use the C based extension instead of json/pure

puts {hash: 123}.to_json
nurettin
fonte
6

Você também pode usar JSON.generate:

require 'json'

JSON.generate({ foo: "bar" })
=> "{\"foo\":\"bar\"}"

Ou seu apelido JSON.unparse:

require 'json'

JSON.unparse({ foo: "bar" })
=> "{\"foo\":\"bar\"}"
Vinicius Brasil
fonte
3

Adicione a seguinte linha na parte superior do seu arquivo

require 'json'

Então você pode usar:

car = {:make => "bmw", :year => "2003"}
car.to_json

Como alternativa, você pode usar:

JSON.generate({:make => "bmw", :year => "2003"})
Apurv Pandey
fonte
-1

Você deve incluir jsonno seu arquivo

Por exemplo,

require 'json'

your_hash = {one: "1", two: "2"}
your_hash.to_json

Para mais informações sobre jsonvocê, visite o link abaixo. Json Learning

Foram Thakral
fonte