json to ruby, clean up hashes and arrays

i am trying to convert a json object to a ruby object in a format that is easy to work with. i use the json.decode and that converts it to ruby as hashes and arrays like it should. the part i am trying to figure out is a clean way to reorganize the hashes (see my code below). the first problem i have, is if any of the fields are missing from the json object i get the "You have a nil object when you didn't expect it!" error. the second issue is it is ugly and hard to read.

what is a good way to do this?

address = ActiveSupport::JSON.decode(address) @address = {} @address['status'] = address['Status']['code'] @address['submitted_address'] = address['name'] @address['full_address'] = address['Placemark'][0]['address'] @address['longitude'] = address['Placemark'][0]['Point']['coordinates'] [0] @address['lattitude'] = address['Placemark'][0]['Point']['coordinates'] [1] @address['elevation'] = address['Placemark'][0]['Point']['coordinates'] [2] @address['accuracy'] = address['Placemark'][0]['AddressDetails'] ['Accuracy'] @address['country'] = address['Placemark'][0]['AddressDetails'] ['Country']['CountryNameCode'] @address['state'] = address['Placemark'][0]['AddressDetails'] ['Country']['AdministrativeArea']['AdministrativeAreaName'] @address['county'] = address['Placemark'][0]['AddressDetails'] ['Country']['AdministrativeArea']['SubAdministrativeArea'] ['SubAdministrativeAreaName'] @address['city'] = address['Placemark'][0]['AddressDetails']['Country'] ['AdministrativeArea']['SubAdministrativeArea']['Locality'] ['LocalityName'] @address['street'] = address['Placemark'][0]['AddressDetails'] ['Country']['AdministrativeArea']['SubAdministrativeArea']['Locality'] ['Thoroughfare']['ThoroughfareName'] @address['zip'] = address['Placemark'][0]['AddressDetails']['Country'] ['AdministrativeArea']['SubAdministrativeArea']['Locality'] ['PostalCode']['PostalCodeNumber']

Hi skud,

skud wrote:

the first problem i have, is if any of the fields are missing from the json object i get the "You have a nil object when you didn't expect it!" error.

The easy way to address the first problem, in a brute force way, would be to add to each line so that, for example, ...

@address['status'] = address['Status']['code']

becomes...

@address['status'] = address['Status']['code'] unless address['Status']['code'].nil?

the second issue is it is ugly and hard to read.

Yeah :wink:

what is a good way to do this?

address = ActiveSupport::JSON.decode(address) @address = {} @address['status'] = address['Status']['code'] @address['submitted_address'] = address['name'] @address['full_address'] = address['Placemark'][0]['address']

One way would, assuming the JSON structure is static, would be to create a table / model with a couple of columns; an entry for each of your @address attributes and a corresponding 'path' to the JSON location for each of your @address attributes. The 'origin' column would contain strings like "address['Placemark'][0]['address']" and the code would like something like...

address = ActiveSupport::JSON.decode(address) @address = {} address_mappings = Address_mappings.find(:all) address_mappings.each do |this_mapping|     @address[this_mapping.destination] = send(this_mapping.origin) end

Definitely NOT elegant. What we call down here in Texas, "lipstick on a pig." :wink: Maybe somebody else will chime in to show us both a better way.

HTH, Bill