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"