Jak przekonwertować JSON na skrót Ruby

137

Mam obiekt JSON zawierający następującą wartość:

@value = {"val":"test","val1":"test1","val2":"test2"}

Chcę przejść przez to w Rubim, aby uzyskać pary klucz / wartość. Kiedy używam @each, nie wykonuje iteracji przez obiekt, ponieważ nie jest w formie skrótu Ruby:

@value = {"val"=>"test","val1"=>"test1","val2"=>"test2"}

Jak mogę przekonwertować powyższy obiekt JSON na skrót Ruby?

zieleń
źródło

Odpowiedzi:

250

A co z następującym fragmentem?

require 'json'
value = '{"val":"test","val1":"test1","val2":"test2"}'
puts JSON.parse(value) # => {"val"=>"test","val1"=>"test1","val2"=>"test2"}
WarHog
źródło
7
value = '{"val":"test","val1":"test1","val2":"test2"}'mogłoby być bardziej czytelne.
luckykrrish
40

Możesz także użyć with_indifferent_accessmetody Railsów, aby uzyskać dostęp do treści za pomocą symboli lub łańcuchów.

value = '{"val":"test","val1":"test1","val2":"test2"}'
json = JSON.parse(value).with_indifferent_access

następnie

json[:val] #=> "test"

json["val"] #=> "test"
crims345
źródło
Czy ktoś wie, czy jest to bardziej wymagające zasobów w przypadku większych obiektów mieszających? Jestem nowy w Ruby / Rails, ale zakładając, że to powiela pary klucz-wartość?
Jonathan,
4

Zakładając, że gdzieś kręci się skrót JSON, aby automatycznie przekonwertować go na coś podobnego do wersji WarHog, zawiń zawartość hash JSON w %q{hsh}tagi.

Wydaje się, że automatycznie dodaje cały niezbędny tekst ucieczki, jak w odpowiedzi WarHog.

boulder_ruby
źródło
4

Czy próbowałeś: http://flori.github.com/json/ ?

W przeciwnym razie możesz to po prostu przeanalizować? Jeśli interesują Cię tylko tablice, coś, co można podzielić na powyższe, będzie dość proste.

Nick Cartwright
źródło
1

Jestem zaskoczony, że nikt nie wskazał []metody JSON , która sprawia, że ​​dekodowanie i kodowanie z / do JSON jest bardzo łatwe i przejrzyste.

Jeśli obiekt jest podobny do łańcucha, przeanalizuj łańcuch i zwróć przeanalizowany wynik jako strukturę danych Rubiego. W przeciwnym razie wygeneruj tekst JSON z obiektu struktury danych Ruby i zwróć go.

Rozważ to:

require 'json'

hash = {"val":"test","val1":"test1","val2":"test2"} # => {:val=>"test", :val1=>"test1", :val2=>"test2"}
str = JSON[hash] # => "{\"val\":\"test\",\"val1\":\"test1\",\"val2\":\"test2\"}"

strzawiera teraz kodowanie JSON hash.

Łatwo to odwrócić za pomocą:

JSON[str] # => {"val"=>"test", "val1"=>"test1", "val2"=>"test2"}

Obiekty niestandardowe muszą być to_szdefiniowane dla klasy, a wewnątrz nich konwertować obiekt na Hash, a następnie używać to_jsonna nim.

Blaszany Człowiek
źródło
0

Możesz użyć klejnotu nice_hash: https://github.com/MarioRuiz/nice_hash

require 'nice_hash'
my_string = '{"val":"test","val1":"test1","val2":"test2"}'

# on my_hash will have the json as a hash, even when nested with arrays
my_hash = my_string.json

# you can filter and get what you want even when nested with arrays
vals = my_string.json(:val1, :val2)

# even you can access the keys like this:
puts my_hash._val1
puts my_hash.val1
puts my_hash[:val1]
Mario Ruiz
źródło