Python / Json: esperando el nombre de la propiedad entre comillas dobles

He estado tratando de encontrar una buena manera de cargar objetos JSON en Python. Envio estos datos json:

{'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna's Homepage"}]}} 

al backend donde se recibirá como una cadena, entonces utilicé json.loads(data) para analizarlo.

Pero cada vez tengo la misma excepción:

 ValueError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1) 

Lo busqué en Google pero nada parece funcionar, además de esta solución json.loads(json.dumps(data)) que personalmente no me parece tan eficiente, ya que acepta cualquier tipo de datos, incluso los que no están en formato json.

Cualquier sugerencia será muy apreciada.

Esta:

 {'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna's Homepage"}]}} 

no es JSON.
Esta:

 {"http://example.org/about": {"http://purl.org/dc/terms/title": [{"type": "literal", "value": "Anna's Homepage"}]}} 

es JSON.

como JSON solo permite incluir cadenas entre comillas dobles, puedes manipular la cadena de esta manera:

 str = str.replace("\'", "\"") 

Esto reemplazará todas las apariciones de comillas simples con comillas dobles en la cadena de caracteres JSON.

También puedes usar js-beautify que es menos estricto:

 $ pip install jsbeautifier $ js-beautify file.js 

Las cadenas JSON deben usar comillas dobles. La biblioteca JSON python aplica esto para que no puedas cargar tu cadena. Sus datos deben verse así:

 {"http://example.org/about": {"http://purl.org/dc/terms/title": [{"type": "literal", "value": "Anna's Homepage"}]}} 

Si eso no es algo que puedes hacer, puedes usar ast.literal_eval() lugar de json.loads()

En pocas palabras, esa cadena no es JSON válida. Como dice el error, los documentos JSON necesitan usar comillas dobles.

Necesitas arreglar la fuente de los datos.

He comprobado tus datos JSON

 {'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna's Homepage"}]}} 

en http://jsonlint.com/ y los resultados fueron:

 Error: Parse error on line 1: { 'http://example.org/ --^ Expecting 'STRING', '}', got 'undefined' 

modificándolo a la siguiente cadena solucione el error JSON:

 { "http://example.org/about": { "http://purl.org/dc/terms/title": [{ "type": "literal", "value": "Anna's Homepage" }] } } 

Como se dice claramente en el error, los nombres deben estar entre comillas dobles en lugar de comillas simples. La cadena que pasa no es un JSON válido. Debe parecerse a

 {"http://example.org/about": {"http://purl.org/dc/terms/title": [{"type": "literal", "value": "Anna's Homepage"}]}} 

En mi caso, las comillas dobles no fueron un problema.

La última coma me dio el mismo mensaje de error.

 {'a':{'b':c,}} ^ 

Para quitar esta coma, escribí un código simple.

 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) 

Y esto funcionó para mí.

Tuve un problema similar. Dos componentes que se comunicaban entre sí utilizaban una cola.

El primer componente no estaba haciendo json.dumps antes de poner el mensaje en cola. Así que la cadena JSON generada por el componente receptor estaba entre comillas simples. Esto estaba causando error

  Expecting property name enclosed in double quotes 

Al agregar json.dumps se comenzó a crear JSON correctamente formateado y problema resuelto.