从json文档生成ruby类

时间:2010-08-17 16:20:12

标签: ruby-on-rails ruby web-services json

使用ruby json API,我想节省一些工作并从头开始生成ruby对象。有什么办法吗?

所以你可以改变这个:

{"menu": {
  "id": "file",
  "value": "File",
  "popup": {
    "menuitem": [
      {"value": "New", "onclick": "CreateNewDoc()"},
      {"value": "Open", "onclick": "OpenDoc()"},
      {"value": "Close", "onclick": "CloseDoc()"}
    ]
  }
}}

到此:

class Menu
  attr_accessor :id
  attr_accessor :file
  attr_accessor :popup
end

4 个答案:

答案 0 :(得分:3)

如果您希望将JSON字符串转换为Ruby Hash,则可以执行

my_hash = JSON.parse('{"foo":"bar"}')
puts my_hash['foo']

答案 1 :(得分:2)

这样做有一个很棒的宝石。 https://github.com/apotonick/representable/

以下是您可以表示的内容

module MenuRepresenter
  include Representable::JSON

  property :id
  property :value
  property :popup
end

创建模型

class Menu
  attr_accessor :id, :value, :popup
end

menu = Menu.new.extend(MenuRepresenter).from_json(json)

# You can convert it back into json via .to_json
# expect(menu.to_json).to eq(json)

上面的示例仅显示了基本实现,您可能希望为菜单项创建另一个类,请查看github repo上的文档以获取更多详细信息。

答案 2 :(得分:1)

如果你想要使用访问器方法的“方法化”哈希(根本不是一个坏主意!)

 require "ostruct"

 object_like_hash = OpenStruct.new(some_hash_with_string_or_symbol_keys)
 object_like_hash.foo #=> same as some_hash["foo"]

不存在的密钥将返回nil而不会不幸。

答案 3 :(得分:1)

我觉得你有点困惑。在这个问题中,您询问如何将JSON 文档转换为类。在评论中,您说您需要一个JDS版本的RXSD XML工具,然而,它将XML schemas 转换为Ruby类。

将JSON文档转换为类并没有多大意义。如果你将文档标记的世界与编程进行比较,文档对应于对象和模式对应于类(实际上,类型,实际上,但是因为我们讨论的是Ruby,所以不要打开那些蠕虫并坚持使用类)。 / p>

因此,从JSON文档生成Ruby对象是有意义的,从JSON模式生成Ruby类是有意义的,但从JSON文档生成Ruby类没有意义。坏消息当然是为了能够从JSON模式自动生成Ruby类,为了使其能够工作,JSON模式必须是可自动处理的(IOW机器可读)格式。

不幸的是,没有 JSON模式这样的东西,因此JSON模式往往不是机器可读的,而只是API上面向人类的英文文本的模糊Web服务提供商的文档页面。如果你很幸运。通常,没有关于JSON模式的文档

因此,由于没有标准化的方法来描述JSON模式,因此不存在用于处理JSON模式的标准化工具。与XML不同,其中标准化模式数量有限(DTD,XSD,RelaxNG)。

请注意,我上面写的内容并不完全正确: JSON模式的规范(例如JSON-Schema),并且有Ruby实现(例如Ruby/JSONSchema,仅验证,不生成类),但没有人使用它们,因此它们可能也不存在。