Можно ли преобразовать строку JSON в объект?
Возможный дубликат:
Разбор строки JSON в рубине
Можно ли преобразовать строку JSON в объект Ruby? Я хотел бы получить доступ к его информации с выражением, похожим на:
drawer.stations.tv.header
Строка JSON:
{
"drawer" : {
"stations" : {
"tv" : {
"header" : "TV Channels",
"logos" : {
"one" : "www1",
"two" : "www2",
"three" : "www3"
}
}
}
}
}
Ответы
Ответ 1
Вы можете проанализировать строку в хэш-рубине, а затем превратить ее в Mash. Mash предоставляет вам доступ к методу.
require 'json'
require 'hashie'
hash = JSON.parse json_string
obj = Hashie::Mash.new hash
obj.drawer.stations.tv.header # => "TV Channels"
Update
Вы также можете сделать это без стороннего драгоценного камня, используя ruby own OpenStruct
:
require 'ostruct'
require 'json'
obj = JSON.parse(json_string, object_class: OpenStruct)
obj.drawer.stations.tv.header # => "TV Channels"
Ответ 2
если вы проанализируете эту строку на ruby-объект, она вернет объект Ruby Hash, вы можете получить его так:
ruby_obj = JSON.parse(json_string)
ruby_obj['drawer']['stations']['tv']['header']
Ответ 3
require 'json'
json_info = %q(
{
"drawer" : {
"stations" : {
"tv" : {
"header" : "TV Channels",
"logos" : {
"one" : "www1",
"two" : "www2",
"three" : "www3"
}
}
}
}
}
)
class MyJson
def self.for(p_jason_string)
self.new(JSON.parse(p_jason_string))
end
def initialize(p_info)
@info = p_info
end
def inspect
@info.inspect
end
def method_missing(p_missing_method_name)
print 'mm '; p p_missing_method_name
key = p_missing_method_name.to_s
if @info.has_key?(key)
then
MyJson.new(@info[key])
else
puts "no key #{p_missing_method_name}"
end
end
end # class MyJson
holder = MyJson.for(json_info)
puts '-----holder.drawer'
p holder.drawer
puts '-----holder.drawer.stations'
p holder.drawer.stations
puts '-----holder.drawer.stations.tv.header'
p holder.drawer.stations.tv.header
Исполнение:
$ ruby -v
ruby 1.9.2p320 (2012-04-20 revision 35421) [x86_64-darwin12.2.0]
$ ruby -w t.rb
-----holder.drawer
mm :drawer
{"stations"=>{"tv"=>{"header"=>"TV Channels", "logos"=>{"one"=>"www1", "two"=>"www2", "three"=>"www3"}}}}
-----holder.drawer.stations
mm :drawer
mm :stations
{"tv"=>{"header"=>"TV Channels", "logos"=>{"one"=>"www1", "two"=>"www2", "three"=>"www3"}}}
-----holder.drawer.stations.tv.header
mm :drawer
mm :stations
mm :tv
mm :header
"TV Channels"
Обратите внимание, что я использую RVM и ничего особенного не имею, чтобы работать с json, должен быть установлен автоматически.