Search code examples
rubyjsonrhomobile

Ruby map JSON into Ruby Class -Can't convert string to Integer


New to JSON/RUBY. I have a Rest Service returning a JSON string and I would like to parse this into a Ruby Class. Is this recommended? I have tried the following example and get error- Can't convert String to Integer. This is for a rhomobile app I'm working on. I'm thinking POJO-->JSON-->Ruby. Any advice would be appreciated.

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

  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    

Returned 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}]

Solution

  • You're getting an array of PolicyList objects, but there is no key called 'PolicyList'. I think you need this:

    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"]) }
    

    To make it easier for you. Here is a complete example.

    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