2012-10-27 5 views
0

나는 레일 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" 

I을 URL을 구문 분석 (이 경우 http://api.deliverhq.com/api/incoming/attachment/7gdd71wo75/5772412/0)하는 방법을 알아 내려고 URL을 데이터베이스에 입력하십시오. URL이 식별자를 가지고 있지 않기 때문에

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

가 작동하지 않습니다 여러 첨부 파일 내에서 값을가 있기 때문에

:url => email_payload['attachments'] 

이 작동하지 않습니다. 이 특정 응용 프로그램의 경우 첨부 파일이 하나만 있어야하므로 가능하면 .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,123,516을 IRB에서
+0

'첨부 파일'과 '첨부 파일'사이를 전환하는 것 같습니다. 단수입니까 복수입니까? –

+0

죄송합니다. 복수형입니다. – dannymcc

+0

'email_payload [: attachments]'는 4 요소 배열을 가진 1 요소 배열이고, 마지막 요소는 URL입니다. 당신이 원하는 것은 그 URL을 얻는 것입니다. 'email_payload [: attachments] [0] [4]'를 사용할 수 없습니까? 그렇지 않다면 제약 조건에 대해 좀 더 구체적이어야합니다. –

답변

1

시도하십시오 : 첨부 파일 (기호)와 '첨부 파일'(문자열) : email_payload의 [ '첨부 파일'] [0] [3]

이 문제가 사이에 차이가있을 수 있습니다 것으로 보인다.

2

:

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

죄송합니다. 콘솔에서 코드를 miscopied했습니다. 그것은'email_payload [ 'attachments'] [0] [3]'- 즉 'attachments' (심볼)이 아닌''attachments'' (문자열)이어야합니다. –