2010-07-12 118 views
24

我願做這樣的事情:如何將Ruby對象轉換成JSON

require 'json' 

class Person 
attr_accessor :fname, :lname 
end 

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

p.to_json 

這可能嗎?

回答

19

試試吧。如果您使用的是Ruby on Rails(並且標籤上顯示您是這樣),我認爲這個確切的代碼應該已經工作了,而不需要任何東西。

Rails支持來自控制器的JSON輸出,因此它已經引入了您將需要的所有JSON序列化代碼。如果您打算通過輸出控制器這個數據,你也許能夠僅通過寫

render :json => @person 
+0

人有什麼關聯? – Sash 2013-12-19 13:27:54

+1

這個答案只適用於Rails項目。香草紅寶石怎麼樣? – cevaris 2014-10-19 01:20:17

+1

我會說它甚至不適用於Rails ..它只適用於軌道應用程序內的控制器..範圍非常有限。 – baash05 2015-05-07 07:55:59

19

是的,你可以做到這一點與to_json,以節省時間。如果你不運行Rails,你可能需要require 'json'

+1

對於Rails,沒有必要使用'require'json'',但是對於普通的Ruby代碼來說,它可能是必需的。 [JSON是Ruby標準庫的一部分](https://ruby-doc.org/stdlib/libdoc/json/rdoc/index.html),所以它帶有語言。 – 2017-05-17 21:00:15

10

爲了讓您的Ruby類JSON友好而不觸及Rails的,您可以定義兩種方法:

  • to_json,它返回一個JSON對象
  • as_json,返回對象
  • 的哈希表示

當你的對象正確既響應to_jsonas_json,可適當的行爲,即使它被嵌套在內心深處其他標準類比如陣列和/或哈希:

#!/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」。