2013-10-23 85 views
4

已經有類似的問題,但我不滿意答案,因爲我正在嘗試做更復雜的事情。通過HTTP,Ruby(無ROR)對對象進行序列化/反序列化

我有提供列表/單個對象的Web服務。對象是用戶,關鍵字等。這裏是例如對象的:

<UserObject name="foo" description="bar" category=<Category name="cat1" description="bar"> locations=[<Location id=1>, <Location id=2>] > 

換句話說對象是有點複雜的,並且可以是這些對象的陣列。我正在尋找一種方式來:

  • 序列化這些對象,以JSON或哈希串
  • 並將它們發送HTTP
  • 反序列化他們OpenStruct對象被序列化對象

服務沒有ROR。 接收和反序列化對象的應用程序是ROR。

必須有一些通用的方法來做到這一點,我嘗試使用to_jsonJSON.parse,但它只反序列化對象到一個級別。因此,對於上面的例子,我會得到:

<OpenStruct name="foo" description="bar" category="{\"name\"... JSON STRING}" locations="JSON STRING"> 

相反JSON撥絃再也想進去對象的對象,因爲它是在原來的。

紅寶石:1.9.3

感謝

+0

@ChrisCashwell通過HTTP進行編組和發送聽起來像是個壞主意?也許我錯了,但編碼可以給我的問題。 –

回答

2

看看在oj寶石。它允許你序列化和反序列化json的ruby對象。它也有快速的好處。

+0

極好的寶石,試了一下!但它轉換爲開放結構?除非我有我的域類存在,否則它將不起作用。所以當我通過http發送它們時,我無法訪問它們,只能將它們複製過來,但這是等待發生的噩夢。我正在閱讀文檔,看看我是否可以強制開放結構。 –

+0

我不確定打開struct,但它可以與普通的ruby類一起工作。如果有的話,你可以擁有真正基本的類,並在其中包含簡單的'attr_accessor'。注意安全性,因爲攻擊者可能通過json插入任意ruby對象。 –

+0

謝謝@ josh-voigts Oj寶石非常棒,解決了我的問題。 –

0

經過調查oj寶石和聯繫它的創始人彼得歐勒,誰是非常好的和幫助,我能夠得到預期的效果。

require 'oj' 

# user instance is nested instance 
json_string = Oj.dump user 

# send over http 
# de-serialize without domain classes (classes created by Oj gem) 
user = Oj.load(json_string, { :auto_define => true }) 

感謝@ josh-voigts讓我知道寶石。