Skip to content Skip to sidebar Skip to footer

Malformed String While Using Ast.literal_eval

I used json dump and then json load on the same data. The data is unicode so I converted it to string. Using the ast.literla_eval I tried to get the type of the string to dict but

Solution 1:

That data returned by check_output is already JSON, so you should not JSON-ify it again with json.dump. You can just write it to the file as is, and the file will be a valid JSON file. And you can load it into a Python object with json.loads:

import json
from pprint import pprint

s ="""{\n\"aaa\": null, \n\"addresses\": \"inner-net=192.168.0.173, x.x.x.x\", \n\"image\": \"aaa (aaa)\", 
    \n\"aaa:vm_state\": \"active\", \n\"aaa:launched_at\": \"2017-12-08T08:21:45.000000\", \n\"flavor\": \"aaa4 (aaa)\", 
    \n\"id\": \"aaa\", \n\"security_groups\": [\n    {\n\"name\": \"default\"\n    }\n  ], \n\"user_id\": \"aaa\", 
    \n\"OS-DCF:diskConfig\": \"MANUAL\", \n\"accessIPv4\": \"\", \n\"accessIPv6\": \"\", \n\"progress\": 0, \n\"Oaa:power_state\": 1, \n\"project_id\": \"aaa\", 
    \n\"config_drive\": \"\", \n\"status\": \"ACTIVE\", \n\"updated\": \"2017-12-08T08:21:45Z\", \n\"hostId\": \"aaa\", \n\"OS-SRV-USG:terminated_at\": null, 
    \n\"key_name\": \"pg_ci\", \n\"properties\": \"\", \n\"OS-EXT-AZ:availability_zone\": \"nova\", \n\"name\": \"taaa\", \n\"created\": \"2017-12-08T08:21:31Z\", \n\"os-extended-volumes:volumes_attached\": [\n    {\n\"id\": \"aaa\"\n    }\n  ]\n}"""

d = json.loads(s)
pprint(d)

output

{'OS-DCF:diskConfig': 'MANUAL',
 'OS-EXT-AZ:availability_zone': 'nova',
 'OS-SRV-USG:terminated_at': None,
 'Oaa:power_state': 1,
 'aaa': None,
 'aaa:launched_at': '2017-12-08T08:21:45.000000',
 'aaa:vm_state': 'active',
 'accessIPv4': '',
 'accessIPv6': '',
 'addresses': 'inner-net=192.168.0.173, x.x.x.x',
 'config_drive': '',
 'created': '2017-12-08T08:21:31Z',
 'flavor': 'aaa4 (aaa)',
 'hostId': 'aaa',
 'id': 'aaa',
 'image': 'aaa (aaa)',
 'key_name': 'pg_ci',
 'name': 'taaa',
 'os-extended-volumes:volumes_attached': [{'id': 'aaa'}],
 'progress': 0,
 'project_id': 'aaa',
 'properties': '',
 'security_groups': [{'name': 'default'}],
 'status': 'ACTIVE',
 'updated': '2017-12-08T08:21:45Z',
 'user_id': 'aaa'}

And if you want to make it into clean JSON, pass that Python object to json.dump or json.dumps

print(json.dumps(d, indent=4))

output

{"aaa":null,"addresses":"inner-net=192.168.0.173, x.x.x.x","image":"aaa (aaa)","aaa:vm_state":"active","aaa:launched_at":"2017-12-08T08:21:45.000000","flavor":"aaa4 (aaa)","id":"aaa","security_groups":[{"name":"default"}],"user_id":"aaa","OS-DCF:diskConfig":"MANUAL","accessIPv4":"","accessIPv6":"","progress":0,"Oaa:power_state":1,"project_id":"aaa","config_drive":"","status":"ACTIVE","updated":"2017-12-08T08:21:45Z","hostId":"aaa","OS-SRV-USG:terminated_at":null,"key_name":"pg_ci","properties":"","OS-EXT-AZ:availability_zone":"nova","name":"taaa","created":"2017-12-08T08:21:31Z","os-extended-volumes:volumes_attached":[{"id":"aaa"}]}

In the original JSON the keys are sorted alphabetically. To do that in the cleaned-up JSON, just pass sort_keys=True to json.dumps.

Post a Comment for "Malformed String While Using Ast.literal_eval"