Python/Json: ожидание имени свойства, заключенного в двойные кавычки
Я пытался найти хороший способ загрузить объекты JSON в Python.
Я отправляю данные json:
{'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna Homepage"}]}}
на бэкэнд, где он будет принят как строка, я использовал json.loads(data)
для его синтаксического анализа.
Но каждый раз, когда у меня возникает одно и то же исключение:
ValueError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
Я googled, но ничего не работает, кроме этого решения json.loads(json.dumps(data))
, которое лично для меня кажется не таким эффективным, поскольку оно принимает любые данные, даже те, которые не находятся в json-формате.
Любые предложения будут высоко оценены.
Ответы
Ответ 1
Это:
{'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna Homepage"}]}}
не является JSON.
Это:
{"http://example.org/about": {"http://purl.org/dc/terms/title": [{"type": "literal", "value": "Anna Homepage"}]}}
- JSON.
Ответ 2
поскольку JSON позволяет заключать строки в двойные кавычки, вы можете манипулировать строкой так:
str = str.replace("\'", "\"")
Это заменит все вхождения одинарной кавычки двойной кавычкой в строке JSON str
.
Вы также можете использовать js-beautify
который менее строг:
$ pip install jsbeautifier
$ js-beautify file.js
Ответ 3
Строки JSON должны использовать двойные кавычки. Библиотека JSON python обеспечивает это, поэтому вы не можете загрузить свою строку. Ваши данные должны выглядеть так:
{"http://example.org/about": {"http://purl.org/dc/terms/title": [{"type": "literal", "value": "Anna Homepage"}]}}
Если это не то, что вы можете сделать, вы можете использовать ast.literal_eval()
вместо json.loads()
Ответ 4
Проще говоря, эта строка недействительна JSON. Как говорится в ошибке, JSON-документы должны использовать двойные кавычки.
Вам нужно исправить источник данных.
Ответ 5
Я проверил данные JSON
{'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna Homepage"}]}}
в http://jsonlint.com/, и результаты были следующими:
Error: Parse error on line 1:
{ 'http://example.org/
--^
Expecting 'STRING', '}', got 'undefined'
изменяя его на следующую строку, разрешите ошибку JSON:
{
"http://example.org/about": {
"http://purl.org/dc/terms/title": [{
"type": "literal",
"value": "Anna Homepage"
}]
}
}
Ответ 6
Как ясно говорится об ошибке, имена должны быть заключены в двойные кавычки вместо одиночных кавычек. Строка, которую вы передаете, просто недействительна JSON. Он должен выглядеть как
{"http://example.org/about": {"http://purl.org/dc/terms/title": [{"type": "literal", "value": "Anna Homepage"}]}}
Ответ 7
В моем случае двойные кавычки не были проблемой.
Последняя запятая дала мне то же сообщение об ошибке.
{'a':{'b':c,}}
^
Чтобы убрать эту запятую, я написал простой код.
import json
with open('a.json','r') as f:
s = f.read()
s = s.replace('\t','')
s = s.replace('\n','')
s = s.replace(',}','}')
s = s.replace(',]',']')
data = json.loads(s)
И это сработало для меня.
Ответ 8
У меня была похожая проблема. Два компонента, общающиеся друг с другом, использовали очередь.
Первый компонент не делал json.dumps перед помещением сообщения в очередь. Таким образом, строка JSON, сгенерированная получающим компонентом, была в одинарных кавычках. Это было причиной ошибки
Expecting property name enclosed in double quotes
Добавление json.dumps начало создавать правильно отформатированный JSON и решил проблему.
Ответ 9
Я использовал этот метод и сумел получить желаемый результат. мой сценарий
x = "{'inner-temperature': 31.73, 'outer-temperature': 28.38, 'keys-value': 0}"
x = x.replace("'", '"')
j = json.loads(x)
print(j['keys-value'])
выход
>>> 0
Ответ 10
В моем случае '\n' имеет значение, после удаления работает нормально