【问题标题】:Generate ruby classes from json document从 json 文档生成 ruby​​ 类
【发布时间】:2010-08-17 16:20:12
【问题描述】:

使用 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

【问题讨论】:

  • 更多细节。你想要什么?你想让 JSON {foo:"bar"} 变成带有 obj.foo # => "bar" 的 Ruby 对象吗?
  • 喜欢这个github.com/movitto/RXSD 但对于json

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


【解决方案1】:

如果您希望将 JSON 字符串转换为 Ruby 哈希,您可以这样做

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

【讨论】:

  • 我相信他是在尝试从 json 生成一个类而不是对其进行配对?
  • 我认为你是对的。在发布到 RXSD 的链接之前,我在问题中阅读了“对象”。所以我不太明白他在找什么。
【解决方案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 中的文档以获取更多详细信息。

【讨论】:

    【解决方案3】:

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

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

    不存在的键将返回 nil 并且不幸的是不会加注。

    【讨论】:

    • 您可以编写一个非常容易完成的递归包装器;-)
    【解决方案4】:

    我觉得你有点困惑。在问题中,您询问如何将 JSON document 转换为类。在 cmets 中,您说您想要一个 RXSD XML 工具的 JSON 版本,但是,它会将 XML 模式 转换为 Ruby 类。

    将 JSON 文档转换为类并没有什么意义。如果您将文档标记的世界与编程进行比较,文档对应于对象,模式对应于类(实际上,类型,但由于我们谈论的是 Ruby,所以我们不要打开蠕虫的罐头并坚持使用类)。

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

    不幸的是,没有像 JSON 模式 这样的东西,因此 JSON 模式通常不是机器可读的,而只是 API 上以人为本的英文文本的简介Web 服务提供商的文档页面。如果你幸运的话。通常情况下,根本没有关于 JSON 模式的文档。

    因此,由于没有标准化的方式来描述 JSON 模式,因此也就没有标准化的工具来处理 JSON 模式。与 XML 不同,XML 的标准化架构数量有限(DTD、XSD、RelaxNG)。

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

    【讨论】:

    • Heroku 和 Google 已采用 JSON 架构
    猜你喜欢
    • 2012-03-27
    • 1970-01-01
    • 2014-08-24
    • 1970-01-01
    • 2011-08-29
    • 2018-06-01
    • 2015-05-17
    • 2016-03-24
    • 1970-01-01
    相关资源
    最近更新 更多