【问题标题】:How to convert a Ruby object to JSON如何将 Ruby 对象转换为 JSON
【发布时间】:2011-03-14 15:41:23
【问题描述】:

我想做这样的事情:

require 'json'

class Person
attr_accessor :fname, :lname
end

p = Person.new
p.fname = "Mike"
p.lname = "Smith"

p.to_json

有可能吗?

【问题讨论】:

    标签: ruby-on-rails ruby json


    【解决方案1】:

    是的,您可以使用to_json

    如果你没有运行 Rails,你可能需要require 'json'

    【讨论】:

    【解决方案2】:

    为了让您的 Ruby 类在不接触 Rails 的情况下对 JSON 友好,您需要定义两种方法:

    • to_json,返回一个 JSON 对象
    • as_json,返回对象的哈希表示

    当您的对象正确响应 to_jsonas_json 时,即使它嵌套在 Array 和/或 Hash 等其他标准类的深处,它也可以正常运行:

    #!/usr/bin/env ruby
    
    require 'json'
    
    class Person
    
        attr_accessor :fname, :lname
    
        def as_json(options={})
            {
                fname: @fname,
                lname: @lname
            }
        end
    
        def to_json(*options)
            as_json(*options).to_json(*options)
        end
    
    end
    
    p = Person.new
    p.fname = "Mike"
    p.lname = "Smith"
    
    # case 1
    puts p.to_json                  # output: {"fname":"Mike","lname":"Smith"}
    
    # case 2
    puts [p].to_json                # output: [{"fname":"Mike","lname":"Smith"}]
    
    # case 3
    h = {:some_key => p}
    puts h.to_json                  # output: {"some_key":{"fname":"Mike","lname":"Smith"}}
    
    puts JSON.pretty_generate(h)    # output
                                    # {
                                    #   "some_key": {
                                    #     "fname": "Mike",
                                    #     "lname": "Smith"
                                    #   }
                                    # }
    

    另见“Using custom to_json method in nested objects”。

    【讨论】:

      【解决方案3】:

      试试看。如果您使用的是 Ruby on Rails(并且标签上说您是),我认为这个确切的代码应该已经可以工作了,不需要任何东西。

      Rails 支持来自控制器的 JSON 输出,因此它已经引入了您将需要的所有 JSON 序列化代码。如果您打算通过控制器输出此数据,则只需编写即可节省时间

      render :json => @person
      

      【讨论】:

      • 什么是人有关联?
      • 此答案仅适用于 Rails 项目。香草红宝石怎么样?
      • 我想说它甚至不适用于 Rails.. 它只适用于 Rails 应用程序内的控制器.. 范围非常有限。
      猜你喜欢
      • 2011-03-12
      • 1970-01-01
      • 2014-06-29
      • 1970-01-01
      • 2017-07-29
      • 1970-01-01
      • 2023-03-17
      • 2017-06-16
      相关资源
      最近更新 更多