Python/Json: se espera el nombre de la propiedad entre comillas dobles
He estado intentando encontrar una buena manera de cargar objetos JSON en Python. Envío 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 y luego solía json.loads(data)
analizarlo.
Pero cada vez obtuve 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 aparte 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.
Este:
{
'http://example.org/about': {
'http://purl.org/dc/terms/title': [
{'type': 'literal', 'value': "Anna's Homepage"}
]
}
}
no es JSON.
Este:
{
"http://example.org/about": {
"http://purl.org/dc/terms/title": [
{"type": "literal", "value": "Anna's Homepage"}
]
}
}
es JSON.
EDITAR:
Algunos comentaristas sugirieron que lo anterior no es suficiente.
Especificación JSON: RFC7159 establece que una cadena comienza y termina con comillas. Eso es "
.
Las comillas simples '
no tienen significado semántico en JSON y solo se permiten dentro de una cadena.
Como JSON solo permite encerrar cadenas entre comillas dobles, puedes manipular la cadena de esta manera:
s = s.replace("\'", "\"")
Si su JSON contiene comillas simples escapadas ( \'
), entonces debería usar el siguiente código más preciso:
import re
p = re.compile('(?<!\\\\)\'')
s = p.sub('\"', s)
Esto reemplazará todas las apariciones de comillas simples con comillas dobles en la cadena JSON s
y, en el último caso, no reemplazará las comillas simples escapadas.
También puedes usar js-beautify
cuál es menos estricto:
$ pip install jsbeautifier
$ js-beautify file.js