2013-03-01 45 views
0

JSON/RUBY的新功能。 我有一個休息服務返回一個JSON字符串,我想解析這個到一個Ruby類。這是建議嗎?我試過下面的例子,並得到錯誤 - 無法將字符串轉換爲整數。這是我正在研究的一個rhomobile應用程序。我在想POJO - > JSON - > Ruby。任何意見,將不勝感激。將Ruby映射到Ruby類的JSON - 不能將字符串轉換爲整數

Ruby 

    @@get_result = @params['body'] 
    puts "@@get_result : #{@@get_result}" 

    data2 [email protected]@get_result 

    cust1 = data2["PolicyList"].map { |rd| PolicyList.new(rd["policyNbr"], rd["systemId"], rd["insuredName"], 
         rd["type"], rd["statusCd"], rd["statusDes"], rd["payorZipcode"], 
         rd["lastPaymentDate"], rd[lastPaymentAmount], rd["pastDueDate"], rd["pastDueAmount"], 
         rd["currentDueDate"], rd["currentDueAmount"], rd["eft"], 
         rd["suspenseAmt"], rd["expireTime"]) } 

class PolicyList 
     attr_accessor :policyNbr, :systemId, :insuredName, 
      :type, :statusCd, :statusDes, :payorZipcode, 
      :lastPaymentDate,:lastPaymentAmount,:pastDueDate, 
      :pastDueAmount,:currentDueDate,:currentDueAmount,:eft, 
      :suspenseAmt,:expireTime 


     def initialize(policyNbr,    systemId,insuredName,type,statusCd,statusDes,payorZipcode,lastPaymentDate,lastPaymentAmount, 
      pastDueDate,pastDueAmount,currentDueDate,currentDueAmount,eft,suspenseAmt,expireTime) 
    @systemId = systemId 
    @insuredName = insuredName 
    @type = type 
    @statusCd = statusCd 
    @statusDes = statusDes 
    @payorZipcode = payorZipcode 
    @lastPaymentDate = lastPaymentDate 
    @lastPaymentAmount = lastPaymentAmount 
    @pastDueDate = pastDueDate 
    @pastDueAmount = pastDueAmount 
    @currentDueDate = currentDueDate 
    @currentDueAmount = currentDueAmount 
    @eft = eft 
    @suspenseAmt = suspenseAmt 
    @expireTime = expireTime 
    end 

end  

返回的JSON

[{"policyNbr":"0000001","systemId":"MB","insuredName":"JOHN DOE ","type":"MEMBERSHIP","statusCd":"01","statusDes":"PAID","payorZipcode":"99999","lastPaymentDate":"07/12/2012","lastPaymentAmount":25.00,"pastDueDate":"","pastDueAmount":0.00,"currentDueDate":"","currentDueAmount":0.00,"eft":false,"suspenseAmt":false,"expireTime":1362152384971},{"policyNbr":"0000002","systemId":"PC","insuredName":"JOHN DOE","type":"AUTO","statusCd":"01","statusDes":"PAID","payorZipcode":"99999","lastPaymentDate":"02/15/2013","lastPaymentAmount":308.50,"pastDueDate":"","pastDueAmount":0.00,"currentDueDate":"","currentDueAmount":0.00,"eft":false,"suspenseAmt":false,"expireTime":0},{"policyNbr":"0000003","systemId":"PC","insuredName":"JOHN DOE","type":"HOME","statusCd":"01","statusDes":"PAID","payorZipcode":"99999","lastPaymentDate":"09/05/2012","lastPaymentAmount":149.00,"pastDueDate":"","pastDueAmount":0.00,"currentDueDate":"","currentDueAmount":0.00,"eft":false,"suspenseAmt":false,"expireTime":0}] 

回答

0

你得到PolicyList對象的數組,但沒有所謂的 'PolicyList' 鍵。我認爲你需要這個:

cust1 = data2.map { |rd| PolicyList.new(rd["policyNbr"], rd["systemId"], rd["insuredName"], 
       rd["type"], rd["statusCd"], rd["statusDes"], rd["payorZipcode"], 
       rd["lastPaymentDate"], rd['lastPaymentAmount'], rd["pastDueDate"], rd["pastDueAmount"], 
       rd["currentDueDate"], rd["currentDueAmount"], rd["eft"], 
       rd["suspenseAmt"], rd["expireTime"]) } 

爲了讓你更容易。這是一個完整的例子。

class PolicyList 
    attr_accessor :policyNbr, :systemId, :insuredName, 
      :type, :statusCd, :statusDes, :payorZipcode, 
      :lastPaymentDate,:lastPaymentAmount,:pastDueDate, 
      :pastDueAmount,:currentDueDate,:currentDueAmount,:eft, 
      :suspenseAmt,:expireTime 


     def initialize(policyNbr,    systemId,insuredName,type,statusCd,statusDes,payorZipcode,lastPaymentDate,lastPaymentAmount, 
      pastDueDate,pastDueAmount,currentDueDate,currentDueAmount,eft,suspenseAmt,expireTime) 
    @systemId = systemId 
    @insuredName = insuredName 
    @type = type 
    @statusCd = statusCd 
    @statusDes = statusDes 
    @payorZipcode = payorZipcode 
    @lastPaymentDate = lastPaymentDate 
    @lastPaymentAmount = lastPaymentAmount 
    @pastDueDate = pastDueDate 
    @pastDueAmount = pastDueAmount 
    @currentDueDate = currentDueDate 
    @currentDueAmount = currentDueAmount 
    @eft = eft 
    @suspenseAmt = suspenseAmt 
    @expireTime = expireTime 
    end 

end 


require 'json' 
json = <<-JSON 
    [{"policyNbr":"0000001","systemId":"MB","insuredName":"JOHN DOE ","type":"MEMBERSHIP","statusCd":"01","statusDes":"PAID","payorZipcode":"99999","lastPaymentDate":"07/12/2012","lastPaymentAmount":25.00,"pastDueDate":"","pastDueAmount":0.00,"currentDueDate":"","currentDueAmount":0.00,"eft":false,"suspenseAmt":false,"expireTime":1362152384971},{"policyNbr":"0000002","systemId":"PC","insuredName":"JOHN DOE","type":"AUTO","statusCd":"01","statusDes":"PAID","payorZipcode":"99999","lastPaymentDate":"02/15/2013","lastPaymentAmount":308.50,"pastDueDate":"","pastDueAmount":0.00,"currentDueDate":"","currentDueAmount":0.00,"eft":false,"suspenseAmt":false,"expireTime":0},{"policyNbr":"0000003","systemId":"PC","insuredName":"JOHN DOE","type":"HOME","statusCd":"01","statusDes":"PAID","payorZipcode":"99999","lastPaymentDate":"09/05/2012","lastPaymentAmount":149.00,"pastDueDate":"","pastDueAmount":0.00,"currentDueDate":"","currentDueAmount":0.00,"eft":false,"suspenseAmt":false,"expireTime":0}] 
JSON 


@@get_result = JSON.parse(json) 

puts "@@get_result : #{@@get_result}\n\n" 

data2 [email protected]@get_result 

cust1 = data2.map { |rd| PolicyList.new(rd["policyNbr"], rd["systemId"], rd["insuredName"], 
       rd["type"], rd["statusCd"], rd["statusDes"], rd["payorZipcode"], 
       rd["lastPaymentDate"], rd['lastPaymentAmount'], rd["pastDueDate"], rd["pastDueAmount"], 
       rd["currentDueDate"], rd["currentDueAmount"], rd["eft"], 
       rd["suspenseAmt"], rd["expireTime"]) } 


puts cust1.inspect 
+1

注意我也是固定的lastPaymentDate鍵(它需要引號) – rainkinz 2013-03-01 16:09:38

+0

感謝。我跑你的建議,並得到錯誤:未初始化的常量。初始化我的PolicyList類並在map函數中調用new有問題嗎? – 2013-03-01 16:14:17

+0

什麼是未初始化的常量?你正在使用這個代替你的例子中相關的代碼位? – rainkinz 2013-03-01 16:16:10