Ruby将JSON映射到Ruby类 - 不能将字符串转换为Integer

时间:2013-03-01 15:53:08

标签: ruby json rhomobile

JSON / RUBY新手。 我有一个Rest服务返回一个JSON字符串,我想将其解析为Ruby类。这是推荐的吗?我尝试了以下示例并获取错误 - 无法将String转换为Integer。这是我正在研究的rhomobile应用程序。我在想POJO - > JSON - > Ruby。任何建议将不胜感激。

Ruby

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

     data2 =@@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}]

1 个答案:

答案 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 =@@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