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' имеет значение, после удаления работает нормально