2012-10-27 44 views
0

我有一個Rails 3應用程序,我使用以下代碼來解析JSON柱:解析嵌入式串形式JSON

email_payload = JSON.parse(params[:payload]) 
Result.create(:from => email_payload['from'], :from_name => email_payload['from_name'], :from_address => email_payload['from_address'], :date => email_payload['date'], :html_body => email_payload['html_body'], :priority => email_payload['priority'], :spam_status => email_payload['spam_status'], :subject => email_payload['subject']) 

的JSON後數據如下:

payload{ "address_identifier": null, "attachments": [ [ "twitter.png", "image/png", 3029, "http://api.deliverhq.com/api/incoming/attachment/7gdd71wo75/5772412/0" ] ], "cc": null, "date": "Thu, 25 Oct 2012 22:04:20 +0100" 

我我試圖解決如何解析URL,在這種情況下,http://api.deliverhq.com/api/incoming/attachment/7gdd71wo75/5772412/0,然後將該URL輸入到數據庫中。

:url => email_payload['attachments'] 

不會工作,因爲有連接內和多個值:

email_attachments_payload = JSON.parse(params[:payload][:attachments]) 
:url => email_attachments_payload['URL'] 

不會工作,因爲該URL不具有標識符。對於這個特定的應用程序,應該只有一個附件,因此如果可能的話,選擇.first可能是一個選項。

任何指針,將不勝感激!

UPDATE:

添加:

email_payload[:attachments][0][4] 

結果示於下述異常錯誤:

NoMethodError: undefined method []' for nil:NilClass 

UPDATE 2

def receive_fax 
    if request.get? 
     render :text => "hello" 
    elsif request.post? 
     email_payload = JSON.parse(params[:payload])  
     Fax.create(:from => email_payload['from'], :from_name => email_payload['from_name'], :from_address => email_payload['from_address'], :date => email_payload['date'], :html_body => email_payload['html_body'], :priority => email_payload['priority'], :spam_status => email_payload['spam_status'], :subject => email_payload['subject'], :fax => email_payload[:attachments][0][3]) 
     render :text => "success" 
    else 
     render :text => "error" 
    end 
    end 
+0

你似乎attachment'和'attachments'之間'進行切換,是單數還是複數? –

+0

對不起,這是複數。 – dannymcc

+0

'email_payload [:附件]'是在它的4元件陣列,其中最後的是URL的1元件陣列。你想要的是獲得該網址?你不能只用'email_payload [:附件] [0] [4]'?如果不是,那麼你必須對約束更具體。 –

回答

1

請再試:email_payload [ '附件'] [0] [3]

看來,問題可能是區別:附件(一個符號)和 '附件'(字符串)。

2

在IRB:

require 'json' 

email_payload = JSON.parse('{ "address_identifier": null, "attachments": [ [ "twitter.png", "image/png", 3029, "http://api.deliverhq.com/api/incoming/attachment/7gdd71wo75/5772412/0" ] ], "cc": null, "date": "Thu, 25 Oct 2012 22:04:20 +0100" }') 
#=> {"address_identifier"=>nil, "attachments"=>[["twitter.png", "image/png", 3029, "http://api.deliverhq.com/api/incoming/attachment/7gdd71wo75/5772412/0"]], "cc"=>nil, "date"=>"Thu, 25 Oct 2012 22:04:20 +0100"} 
email_payload['attachments'][0][3] 
#=> "http://api.deliverhq.com/api/incoming/attachment/7gdd71wo75/5772412/0" 

如果不工作,然後還有別的事情,你有沒有如上所述。

UPDATE:哈希從JSON.parse返回時,attachments關鍵應該是一個字符串('attachments'),而不是一個符號(:attachments)。上面更新了我的答案。

+0

我解析導致錯誤的有效載荷的方式?我用完整的代碼更新了我的問題。 – dannymcc

+0

很抱歉,我從控制檯錯誤地輸入了我的代碼。它應該是'email_payload ['attachments'] [0] [3]' - 即''附件''(一個字符串)而不是':附件'(一個符號)。 –