Come convertire un oggetto hash ruby ​​in JSON?


340

Come convertire un oggetto hash ruby ​​in JSON? Quindi sto provando questo esempio qui sotto e non funziona?

Stavo guardando il RubyDoc e ovviamente l' Hashoggetto non ha un to_jsonmetodo. Ma sto leggendo sui blog che Rails supporta active_record.to_jsone supporta anche hash#to_json. Capisco che ActiveRecordè un oggetto Rails, ma Hashnon è nativo di Rails, è un puro oggetto Ruby. Quindi in Rails puoi fare un hash.to_json, ma non in puro Ruby ??

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

Risposte:


563

Una delle numerose bellezze di Ruby è la possibilità di estendere le classi esistenti con i tuoi metodi. Si chiama "riapertura di classe" o "patch-monkey" (il significato di quest'ultimo può variare , però).

Quindi, dai un'occhiata qui:

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"}"

Come puoi vedere, richiedere jsonha magicamente portato il metodo to_jsonal nostro Hash.


2
tutto quello che posso dire è wow :) anche grazie mille !! quindi praticamente sono stato in grado di estendere dinamicamente la classe json ??
Kapso,

1
Ho provato la stessa cosa con l'oggetto Ruby e non funziona ?? >> request '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 =>" \ "# <Person: 0x101155f70> \" "
kapso

10
No, no, qualcuno deve codificare come l'oggetto di una classe arbitraria debba essere serializzato su JSON. L'hanno fatto per Hashe Arrayclassi in jsongemma, ma la tua classe Personè solo una pianura Object. Ma puoi ereditare Hashinvece. Puoi aprire una nuova domanda se non riesci.
Mladen Jablanović,

Grazie. ecco la nuova domanda, qualsiasi aiuto sarebbe apprezzato. Grazie. stackoverflow.com/questions/3226054/...
kapso

Stai mostrando quello che sembra essere un output di tipo IRB. Stavo cercando di far funzionare l'hash # to_json per l'oggetto DateTime. Grazie a questo post l'ho capito. Ma ho ispezionato con p date_json Questo è quello che ho ottenuto per una vera stringa "{\" year \ ": 2013, \" mon \ ": 7, \" mday \ ": 16, \" hour \ ": 13, \ "min \": 54, \ "sec \": 32, \ "zone \": \ "- 05:00 \", \ "offset \": - 18000} ", quindi potresti vedere che sta facendo il simboli chiave come stringhe e ovviamente che i dati sono invariati. Grazie ancora. Scusate il ritardo, però.
Douglas G. Allen,

19
require 'json/ext' # to use the C based extension instead of json/pure

puts {hash: 123}.to_json

6

Puoi anche usare JSON.generate:

require 'json'

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

O alias JSON.unparse:

require 'json'

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

3

Aggiungi la seguente riga nella parte superiore del file

require 'json'

Quindi puoi usare:

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

In alternativa, puoi usare:

JSON.generate({:make => "bmw", :year => "2003"})

-1

Dovresti includere jsonnel tuo file

Per esempio,

require 'json'

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

Per ulteriori informazioni su di jsonte puoi visitare il link qui sotto. Json Learning

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.