Nasıl JSON Ruby karma dönüştürmek için


137

Aşağıdaki değeri tutan bir JSON nesnesi var:

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

Anahtar / değer çiftlerini almak için Ruby'de döngü yapmak istiyorum. Ne zaman kullandığım @each, Ruby karma formunda olmadığı için nesne üzerinden yinelenmez:

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

Yukarıdaki JSON nesnesini Ruby karmasına nasıl dönüştürebilirim?

Yanıtlar:


250

Aşağıdaki kod parçasına ne olacak?

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

7
value = '{"val":"test","val1":"test1","val2":"test2"}'daha okunabilir olabilirdi.
luckykrrish

40

Ayrıca, Rails with_indifferent_accessyöntemini kullanarak vücuda sembollerle veya dizelerle erişebilirsiniz.

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

sonra

json[:val] #=> "test"

json["val"] #=> "test"

Herkes bunun daha büyük karma nesneler için daha kaynak yoğun olup olmadığını biliyor mu? Ruby / Rails'te yeniyim, ancak bunun anahtar / değer çiftlerini yinelediği varsayılarak?
Jonathan

4

Bir yerde asılı bir JSON karmaınız olduğunu varsayarsak, otomatik olarak WarHog'un sürümü gibi bir şeye dönüştürmek için JSON karma içeriğinizi %q{hsh}etiketlere sarın .

Bu, WarHog'un cevabı gibi gerekli tüm kaçan metinleri otomatik olarak ekliyor gibi görünüyor.



1

Kimsenin JSON'un []yöntemini işaret etmesine şaşırdım , bu da kodlamayı çözmeyi ve JSON'dan kodlamayı çok kolay ve şeffaf hale getiriyor.

Nesne dizeye benzerse, dizeyi ayrıştırın ve çözümlenen sonucu Ruby veri yapısı olarak döndürün. Aksi takdirde Ruby veri yapısı nesnesinden bir JSON metni oluşturun ve döndürün.

Bunu düşün:

require 'json'

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

strşimdi kodlanmış JSON içeriyor hash.

Aşağıdakileri kullanarak tersine çevirmek kolaydır:

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

Özel nesnelerin to_ssınıf için tanımlanması gerekir ve içinde nesne bir Hash'e dönüştürüp to_jsonüzerinde kullanın .


0

Nice_hash taşını kullanabilirsiniz: 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]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.