Как прочитать корневой массив JSON в список?

#python #json #string #list

#python #json #строка #Список

Вопрос:

У меня есть строка, содержащая массив JSON:

 s = "['GY2_CAMP1', 'GY2_CAMP2', 'GY2_CAMP3', 'GY2_CAMP4', 'GY2_CAMP5']"
  

Я попытался проанализировать его как JSON:

 import json
l = json.loads(s)
  

Я хотел получить список, но возникло исключение:

 Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/xx/anaconda3/lib/python3.7/json/__init__.py", line 348, in loads
    return _default_decoder.decode(s)
  File "/home/xx/anaconda3/lib/python3.7/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/home/xx/anaconda3/lib/python3.7/json/decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 2 (char 1)
  

Я не уверен, что здесь происходит.

Комментарии:

1. Ваша строка недопустима в формате json. Это работает: s2 = s.replace("'", """); l = json.loads(s2)

Ответ №1:

Используйте ast.literal_eval :

 >>> from ast import literal_eval 
>>> s = "['GY2_CAMP1', 'GY2_CAMP2', 'GY2_CAMP3', 'GY2_CAMP4', 'GY2_CAMP5']"
>>> literal_eval(s)
['GY2_CAMP1', 'GY2_CAMP2', 'GY2_CAMP3', 'GY2_CAMP4', 'GY2_CAMP5']
  

Комментарии:

1. Спасибо. Это более элегантно, чем замена символов в строке перед синтаксическим анализом в формате json.

Ответ №2:

Стандарт Json требует двойных кавычек, он не поддерживает одинарные кавычки. Вот почему вы получаете ошибку

Таким образом, строка должна быть

 s = '["GY2_CAMP1", "GY2_CAMP2", "GY2_CAMP3", "GY2_CAMP4", "GY2_CAMP5"]'
  

Затем вы получаете ожидаемое поведение

 import json
l = json.loads(s)
print(l)
>> ['GY2_CAMP1', 'GY2_CAMP2', 'GY2_CAMP3', 'GY2_CAMP4', 'GY2_CAMP5']
  

Ответ №3:

Сначала замените ' на " , а затем загрузите.

 import json
s = "['GY2_CAMP1', 'GY2_CAMP2', 'GY2_CAMP3', 'GY2_CAMP4', 'GY2_CAMP5']"
s.replace("'", """)

l = json.loads(s1)
print(l)
  

получит

 ['GY2_CAMP1', 'GY2_CAMP2', 'GY2_CAMP3', 'GY2_CAMP4', 'GY2_CAMP5']