PythonLearner
PythonLearner

Reputation: 29

Python issue with getting data out of json.loads

I have the following JSON data which I pass through json.loads:

{
   "meta":{
      "limit":20,
      "next":null,
      "offset":0,
      "previous":null,
      "total_count":2
   },
   "objects":[
      {
         "attributes":"{u'_code': u'[ON CODE]/[OFF CODE]', u'_type': u'pick actuator or sensor', u'code': u'AF126E/AF1266', u'type': u'actuator'}",
         "id":1,
         "module":"/api/v1/module/1/",
         "moduleName":"rfm_ninjablock (ninjablock)",
         "name":"HallwayLight"
      },
      {
         "attributes":"{u'_code': u'[ON CODE]/[OFF CODE]', u'_type': u'pick actuator or sensor', u'code': u'0x53df5c', u'type': u'sensor'}",
         "id":2,
         "module":"/api/v1/module/1/",
         "moduleName":"rfm_ninjablock (ninjablock)",
         "name":"ToiletDoor"
      }
   ]
}

I'm trying to get all the data out of it, but I'm having trouble referencing the data. My code is as follows:

for object in r['objects']:
        for attributes in object.iteritems():
                print attributes

Which gives me:

(u'attributes', u"{u'_code': u'[ON CODE]/[OFF CODE]', u'_type': u'pick actuator or sensor', u'code': u'AF126E/AF1266', u'type': u'actuator'}")
(u'moduleName', u'rfm_ninjablock (ninjablock)')
(u'id', 1)
(u'module', u'/api/v1/module/1/')
(u'name', u'HallwayLight')
(u'attributes', u"{u'_code': u'[ON CODE]/[OFF CODE]', u'_type': u'pick actuator or sensor', u'code': u'0x53df5c', u'type': u'sensor'}")
(u'moduleName', u'rfm_ninjablock (ninjablock)')
(u'id', 2)
(u'module', u'/api/v1/module/1/')
(u'name', u'ToiletDoor')

I'm not really sure of referencing these or if indeed I'm doing it right.

Attributes contains JSON already, as that is how it is stored in the database.

Upvotes: 0

Views: 83

Answers (2)

PythonLearner
PythonLearner

Reputation: 29

As the dict inside attributes ends up as a string representation I used the following code to convert it to the dict:

for object in r['objects']:
    attrib = []
    attrib =  ast.literal_eval(object['attributes'])
    print attrib['code']

Upvotes: 0

Daniel Roseman
Daniel Roseman

Reputation: 599490

You have a problem with the way the original data was serialized. The attributes dict of each element was not serialized as a set of nested dicts, but as an outer dict containing Python string representations of the inner dicts.

You should post the code that did the original serialization.

Upvotes: 2

Related Questions