首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >可以将JSON字符串转换为对象吗?

可以将JSON字符串转换为对象吗?
EN

Stack Overflow用户
提问于 2012-12-16 09:40:54
回答 3查看 22.1K关注 0票数 24

可能重复:

Parsing a JSON string in ruby

可以将JSON字符串转换为Ruby对象吗?我想用类似如下的表达式来访问它的信息:

代码语言:javascript
复制
drawer.stations.tv.header

JSON字符串:

代码语言:javascript
复制
{
  "drawer" : {
    "stations" : {
      "tv" : {
        "header" : "TV Channels",
        "logos" : {
          "one" : "www1",
          "two" : "www2",
          "three" : "www3"
        }
      }
    }
  }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-16 17:46:40

您可以将字符串解析为拼音散列,然后将其转换为Mash。Mash为您提供了类似方法的访问。

代码语言:javascript
复制
require 'json'
require 'hashie'

hash = JSON.parse json_string
obj = Hashie::Mash.new hash
obj.drawer.stations.tv.header # => "TV Channels"

更新

你也可以在没有第三方gem的情况下,使用ruby自己的OpenStruct

代码语言:javascript
复制
require 'ostruct'
require 'json'

obj = JSON.parse(json_string, object_class: OpenStruct)
obj.drawer.stations.tv.header # => "TV Channels"
票数 56
EN

Stack Overflow用户

发布于 2012-12-16 09:43:47

如果你把这个字符串解析成ruby对象,它会返回一个ruby Hash对象,你可以这样得到它

代码语言:javascript
复制
  ruby_obj = JSON.parse(json_string)
  ruby_obj['drawer']['stations']['tv']['header']
票数 9
EN

Stack Overflow用户

发布于 2012-12-16 17:22:53

代码语言:javascript
复制
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

执行:

代码语言:javascript
复制
$ 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工作,必须是自动安装的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13897846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档