Я пытался найти хороший способ загрузки объектов JSON в Python. Я отправляю эти данные json:
{'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna's Homepage"}]}}
на бэкэнд, где он будет получен в виде строки, которую я использовал json.loads(data)
для ее анализа.
Но каждый раз получалось одно и то же исключение:
ValueError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
Я погуглил, но, похоже, ничего не работает, кроме этого решения, json.loads(json.dumps(data))
которое лично мне кажется не таким эффективным, поскольку оно принимает любые данные, даже те, которые не в формате json.
Мы будем очень благодарны за любые предложения.
json.dumps()
а не просто записывайте python и надеясь, что нотация python будет работать в вашем читателе JavaScript.print(jsonpickle_deserialized_object_string)
и попытался его использовать. Почему-тоprint()
меняет цитаты с"
на'
Ответы:
Этот:
{'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna's Homepage"}]}}
не является JSON.
Этот:
{"http://example.org/about": {"http://purl.org/dc/terms/title": [{"type": "literal", "value": "Anna's Homepage"}]}}
это JSON.
РЕДАКТИРОВАТЬ:
Некоторые комментаторы предположили, что вышеуказанного недостаточно.
Спецификация JSON - RFC7159 утверждает, что строка начинается и заканчивается кавычками. То есть
"
.Одиночные кавычки
'
не имеют семантического значения в JSON и разрешены только внутри строки.источник
поскольку JSON позволяет заключать строки только в двойные кавычки, вы можете управлять строкой следующим образом:
str = str.replace("\'", "\"")
если ваш JSON содержит экранированные одинарные кавычки (
\'
), вам следует использовать более точный следующий код:import re p = re.compile('(?<!\\\\)\'') str = p.sub('\"', str)
Это заменит все вхождения одинарной кавычки на двойную кавычку в строке JSON,
str
и в последнем случае не заменит экранированные одинарные кавычки.Вы также можете использовать
js-beautify
менее строгие:источник
В моем случае двойные кавычки не были проблемой.
Последняя запятая дала мне такое же сообщение об ошибке.
{'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)
И это сработало для меня.
источник
echo '{"json":"obj",}' | python -m json.tool
при запуске в оболочке выдает «Ожидаемое имя свойства, заключенное в двойные кавычки: строка 1, столбец 15 (символ 14)». Завершающие запятые не являются допустимым JSON, но было бы неплохо, если бы модуль Python JSON в этом случае выдавал соответствующее сообщение об ошибке.Проще говоря, эта строка не является допустимым JSON. Как говорится в ошибке, документы JSON должны использовать двойные кавычки.
Вам необходимо исправить источник данных.
источник
Я проверил ваши данные JSON
{'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna's 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's Homepage" }] } }
источник
Строки JSON должны использовать двойные кавычки. Библиотека Python JSON обеспечивает это, поэтому вы не можете загрузить свою строку. Ваши данные должны выглядеть так:
{"http://example.org/about": {"http://purl.org/dc/terms/title": [{"type": "literal", "value": "Anna's Homepage"}]}}
Если это не то, что вы можете сделать, вы можете использовать
ast.literal_eval()
вместоjson.loads()
источник
json.loads()
ast.literal_eval
приведет к тому,ValueError: malformed string
что строка JSON имеет логическое значение.import ast inpt = {'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna's Homepage"}]}} json_data = ast.literal_eval(json.dumps(inpt)) print(json_data)
это решит проблему.
источник
Как явствует из ошибки, имена следует заключать в двойные кавычки вместо одинарных. Передаваемая вами строка просто недействительна в формате JSON. Это должно выглядеть так
{"http://example.org/about": {"http://purl.org/dc/terms/title": [{"type": "literal", "value": "Anna's Homepage"}]}}
источник
Я использовал этот метод и мне удалось получить желаемый результат. мой сценарий
x = "{'inner-temperature': 31.73, 'outer-temperature': 28.38, 'keys-value': 0}" x = x.replace("'", '"') j = json.loads(x) print(j['keys-value'])
выход
источник
with open('input.json','r') as f: s = f.read() s = s.replace('\'','\"') data = json.loads(s)
Это отлично сработало для меня. Спасибо.
источник
x = x.replace("'", '"') j = json.loads(x)
Хотя это правильное решение, но оно может вызвать головную боль, если есть такой JSON -
{'status': 'success', 'data': {'equity': {'enabled': True, 'net': 66706.14510000008, 'available': {'adhoc_margin': 0, 'cash': 1277252.56, 'opening_balance': 1277252.56, 'live_balance': 66706.14510000008, 'collateral': 249823.93, 'intraday_payin': 15000}, 'utilised': {'debits': 1475370.3449, 'exposure': 607729.3129, 'm2m_realised': 0, 'm2m_unrealised': -9033, 'option_premium': 0, 'payout': 0, 'span': 858608.032, 'holding_sales': 0, 'turnover': 0, 'liquid_collateral': 0, 'stock_collateral': 249823.93}}, 'commodity': {'enabled': True, 'net': 0, 'available': {'adhoc_margin': 0, 'cash': 0, 'opening_balance': 0, 'live_balance': 0, 'collateral': 0, 'intraday_payin': 0}, 'utilised': {'debits': 0, 'exposure': 0, 'm2m_realised': 0, 'm2m_unrealised': 0, 'option_premium': 0, 'payout': 0, 'span': 0, 'holding_sales': 0, 'turnover': 0, 'liquid_collateral': 0, 'stock_collateral': 0}}}}
Заметили это "Истинное" значение? Используйте это для двойной проверки логических значений. Это покроет те случаи -
x = x.replace("'", '"').replace("True", '"True"').replace("False", '"False"').replace("null", '"null"') j = json.loads(x)
Также убедитесь, что вы не делаете
Это должна быть другая переменная.
источник
У меня была аналогичная проблема. Два компонента, взаимодействующие друг с другом, использовали очередь.
Первый компонент не выполнял json.dumps перед помещением сообщения в очередь. Таким образом, строка JSON, сгенерированная получающим компонентом, была заключена в одинарные кавычки. Это вызывало ошибку
Expecting property name enclosed in double quotes
Добавление json.dumps начало создавать правильно отформатированный JSON и решить проблему.
источник
Используйте
eval
функцию.Он заботится о расхождении между одинарными и двойными кавычками.
источник
Как хорошо объясняют другие ответы, ошибка возникает из-за недопустимых символов кавычек, переданных в модуль json.
В моем случае я продолжал получать ValueError даже после замены
'
на"
в моей строке. В конце концов я понял, что некоторые символы Юникода, похожие на кавычки, попали в мою строку:Чтобы очистить все это, вы можете просто передать свою строку через регулярное выражение:
import re raw_string = '{“key”:“value”}' parsed_string = re.sub(r"[“|”|‛|’|‘|`|´|″|′|']", '"', my_string) json_object = json.loads(parsed_string)
источник
Я сталкивался с этой проблемой несколько раз, когда JSON редактировался вручную. Если кто-то удалил что-то из файла, не заметив этого, это может вызвать ту же ошибку.
Например, если ваш последний JSON "}" отсутствует, будет выдана та же ошибка.
Поэтому, если вы редактируете файл вручную, убедитесь, что вы форматируете его так, как того ожидает декодер JSON, иначе вы столкнетесь с той же проблемой.
Надеюсь это поможет!
источник
Всегда идеально использовать
json.dumps()
метод. Чтобы избавиться от этой ошибки, я использовал следующий кодjson.dumps(YOUR_DICT_STRING).replace("'", '"')
источник