2017-12-08 1 views
3

json dump를 사용한 다음 json load를 동일한 데이터에 사용했습니다. 데이터는 유니 코드이므로 문자열로 변환했습니다. ast.literla_eval을 사용하여 dict에 문자열 형식을 얻으려고했지만 잘못된 형식의 문자열이 표시됩니다. JSON 부하의ast.literal_eval을 사용하는 중에 형식이 잘못된 문자열

출력 내가 뭘하려

('data', u'{\n "a": "spawning", \n "addresses": "", \n "image": "b", \n "OS-EXT-STS:vm_state": "building", \n "c:launched_at": null, \n "d": "e (fgh)", \n "user_id": "hhh", \n 
    "accessIPv4": "", \n "accessIPv6": "", \n "name": "kk", \n "created": "2017-12-08T07:52:44Z", \n "z:xyz": []\n}', <type 'unicode'>) 

이하?

 with open('openstack_list.json', 'w') as e: 
      json.dump(check_output(['openstack', 'server', 'show', i, '-f', 'json']), e) 
     with open('openstack_list.json', 'r') as a: 
      data = json.load(a) 
      new_data = data.encode('utf-8') # output type is unicode 
      dict_data = ast.literal_eval(new_data) # output type is string 

출력이 사전이되고 싶지만 얻지 못했습니다. 또한 json로드는 유니 코드 데이터를 제공하므로 new_data = data.encode('utf-8')은 중복됩니다. 하지만 인코딩없이 ast.literal_eval을 사용하면 잘못된 형식의 문자열 오류가 발생합니다. 어쨌든, 데이터 유형을 사전으로 가져올 수 없습니다.

편집 :

오류 : JSON 덤프 전에

Traceback (most recent call last): 
    File "openstack_resource_list.py", line 84, in <module> 
    output = get_resources() 
    File "openstack_resource_list.py", line 47, in get_resources 
    dict_data = ast.literal_eval(new_data) 
    File "/usr/lib64/python2.7/ast.py", line 80, in literal_eval 
    return _convert(node_or_string) 
    File "/usr/lib64/python2.7/ast.py", line 63, in _convert 
    in zip(node.keys, node.values)) 
    File "/usr/lib64/python2.7/ast.py", line 62, in <genexpr> 
    return dict((_convert(k), _convert(v)) for k, v 
    File "/usr/lib64/python2.7/ast.py", line 79, in _convert 
    raise ValueError('malformed string') 
ValueError: malformed string 

데이터 : 데이터가 check_output에 의해 반환 된

"{\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}" 
+1

'openstack_list.json'의 실제 내용을 보여줄 수 있습니까? 또한 파이썬 2를 사용하고있는 것입니다. – poke

+1

데이터가 두 번 jsonified 된 것처럼 보입니다. check_output() 함수의 원시 반환 값 (_before_' json.dump (...))과'check_output() '전화? –

+0

당신이 –

답변

3

은 이미 JSON 당신해야 하지 JSON-쓸어 때문에 다시 json.dump으로. 있는 그대로 파일에 기록하면 파일이 유효한 JSON 파일이됩니다.

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) 

출력

{'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'} 

을 그리고 당신은 깨끗한 JSON으로 만들려면, json.dump 또는 json.dumps

해당 파이썬 개체를 전달할 : 그리고 당신은 json.loads와 파이썬 객체로로드 할 수 있습니다
print(json.dumps(d, indent=4)) 

출력

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

원래 JSON에서는 키가 사전 순으로 정렬됩니다. 정리 된 JSON에서이를 수행하려면 sort_keys=Truejson.dumps으로 전달하십시오.

+1

이것은한다. JSON 데이터를 두 배로하지 않는 것을 배웠습니다. :) –

관련 문제