Как преобразовать строку с dict в реальный объект dict? - PullRequest
0 голосов
/ 06 июля 2019

У меня есть строковый вывод как это (это строка, возвращаемая командой Popen):

p = Popen(ZOO_CMD, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE)
output, err = p.communicate()
print output

переменная output печатает:

{
  "animals": [
    {
      "animalCount": 1
    }
  ],
  "zooName": "zoo1"
}

Я пыталсячтобы загрузить строку как таковую

json_dict = json.loads(output)
print json_dict['animals']

Я получаю эту трассировку

Traceback (most recent call last):
  File "./zoo_dump", line 44, in <module>
    json_dict = json.loads(output)
  File "/usr/lib64/python2.6/json/__init__.py", line 307, in loads
    return _default_decoder.decode(s)
  File "/usr/lib64/python2.6/json/decoder.py", line 319, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib64/python2.6/json/decoder.py", line 338, in raw_decode
    raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded

Есть идеи, как это исправить?

1 Ответ

2 голосов
/ 06 июля 2019

Вы пытаетесь сделать его действительным JSON, а затем анализируете, но это может привести к ошибкам, если у вас нет очень предсказуемых ошибок json.

Вместо этого вы можете использовать ast.literal_evalчтобы безопасно оценить его в python:

import ast 

s = '''{
  "animals": [
    {
      "animalCount": 1,
    }
  ],
  "zooName": 'zoo1'
}'''

ast.literal_eval(s)

Результат

{'animals': [{'animalCount': 1}], 'zooName': 'zoo1'}
...