2010-08-17 79 views
2

消費ruby json API,我想省掉一些工作並從蝙蝠生成ruby對象。任何方式來做到這一點?從json文檔生成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 
+1

更多細節。你想要什麼?你想讓JSON'{foo:「bar」}'變成一個帶有'obj.foo#=>「bar」'的Ruby對象嗎? – jtbandes 2010-08-17 16:21:23

+0

像這樣http://github.com/movitto/RXSD但是對於json – 2010-08-17 17:03:14

回答

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倉庫中的文檔以獲取更多詳細信息。

3

如果你正在尋找把一個JSON字符串成一個Ruby的Hash你可以做

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

我相信他正試圖從json中生成一個類而不是將它與它相比較? – Steve 2010-08-17 18:37:07

+0

我認爲你是對的。在發佈RXSD鏈接之前,我在問題中讀取了「對象」。所以我不太明白他在找什麼。 – aNoble 2010-08-17 19:15:37

1

如果你想使用訪問器方法的「方法化」散列(根本不是一個壞主意!)

require "ostruct" 

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

不存在的鍵將返回零而不是不幸的提高。

+0

不適用於嵌套對象。 – 2012-06-23 22:54:46

+0

你可以寫一個很容易做的遞歸包裝;-) – Julik 2012-06-30 22:47:39

0

我覺得你有點困惑。在這個問題中,您問如何將JSON 文檔轉換爲類。在評論中,你說你需要一個JSON版本的RXSD XML工具,然而,它將XML 模式轉換爲Ruby類。

將JSON文檔轉換爲類沒有任何意義。如果將文檔標記的世界與編程相比較,文檔對應於對象,而模式對應於類(實際上是類型,但是由於我們談論的是Ruby,所以我們不要打開那些蠕蟲並堅持使用類)。

因此,從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,驗證而已,不生成類),但沒有人正在使用它們,所以它們可能不存在。

+0

它不一定是一個模式來做它的代碼生成... – 2010-08-17 18:39:39

+0

Heroku和谷歌已採用JSON模式 – 2014-04-07 17:21:45