He estado tratando de 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, luego solía json.loads(data)
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.
json.dumps()
lugar de simplemente escribir python y esperar que la notación python funcione en su lector de JavaScript.print(jsonpickle_deserialized_object_string)
e intenté usarlo. Por alguna razónprint()
cambia las citas de"
a'
Respuestas:
Esta:
no es JSON.
Esta:
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
"
.Single Quoute
'
no tiene significado semántico en JSON y solo se permite dentro de una cadena.fuente
como JSON solo permite encerrar cadenas con comillas dobles, puede manipular la cadena de esta manera:
si su JSON contiene comillas simples (
\'
), entonces debe usar el siguiente código más preciso:Esto reemplazará todas las ocurrencias de comillas simples con comillas dobles en la cadena JSON
str
y, en el último caso, no reemplazará las comillas simples escapadas.También puede usar lo
js-beautify
que es menos estricto:fuente
En mi caso, las comillas dobles no fueron un problema.
La última coma me dio el mismo mensaje de error.
Para eliminar esta coma, escribí un código simple.
Y esto funcionó para mí.
fuente
echo '{"json":"obj",}' | python -m json.tool
cuando se ejecuta en el shell, da "Esperando nombre de propiedad entre comillas dobles: línea 1 columna 15 (carácter 14)". Las comas finales no son JSON legales, pero sería bueno si el módulo JSON de Python emitiera un mensaje de error relevante en este caso.Simplemente, esa cadena no es JSON válido. Como dice el error, los documentos JSON deben usar comillas dobles.
Necesita arreglar la fuente de los datos.
fuente
Revisé tus datos JSON
en http://jsonlint.com/ y los resultados fueron:
modificarlo a la siguiente cadena resuelve el error JSON:
fuente
Las cadenas JSON deben utilizar comillas dobles. La biblioteca JSON python hace cumplir esto, por lo que no puede cargar su cadena. Sus datos deben verse así:
Si eso no es algo que pueda hacer, podría usar en
ast.literal_eval()
lugar dejson.loads()
fuente
json.loads()
ast.literal_eval
dará como resultadoValueError: malformed string
si la cadena JSON tiene un valor booleano.Esto solucionará el problema.
fuente
Como dice claramente por error, los nombres deben escribirse entre comillas dobles en lugar de comillas simples. La cadena que pasa no es un JSON válido. Debería verse como
fuente
Usé este método y logré obtener el resultado deseado. mi guion
salida
fuente
Esto funcionó perfectamente bien para mí. Gracias.
fuente
Aunque esta es la solución correcta, puede provocar un gran dolor de cabeza si hay un JSON como este:
¿Notó ese valor "Verdadero" ? Use esto para hacer que las cosas se verifiquen dos veces para los booleanos. Esto cubrirá esos casos:
Además, asegúrese de no hacer
Tiene que ser otra variable.
fuente
Tuve un problema similar. Dos componentes que se comunican entre sí estaban usando una cola.
El primer componente no estaba haciendo json.dumps antes de poner el mensaje en la cola. Entonces, la cadena JSON generada por el componente receptor estaba entre comillas simples. Esto estaba causando un error
La adición de json.dumps comenzó a crear JSON con el formato correcto y se resolvió el problema.
fuente
Usa la
eval
función.Se encarga de la discrepancia entre comillas simples y dobles.
fuente
Como las otras respuestas explican bien, el error se produce debido a caracteres de comillas no válidos que se pasan al módulo json.
En mi caso, seguí obteniendo ValueError incluso después de reemplazar
'
con"
en mi cadena. Lo que finalmente me di cuenta fue que algunos símbolos Unicode con forma de comillas se habían introducido en mi cadena:Para limpiar todos estos, simplemente puede pasar su cadena a través de una expresión regular:
fuente
Me he encontrado con este problema varias veces cuando el JSON se ha editado a mano. Si alguien borra algo del archivo sin darse cuenta, puede arrojar el mismo error.
Por ejemplo, si falta su último JSON "}", arrojará el mismo error.
Entonces, si edita su archivo a mano, asegúrese de formatearlo como lo espera el decodificador JSON; de lo contrario, se encontrará con el mismo problema.
¡Espero que esto ayude!
fuente
Siempre es ideal utilizar el
json.dumps()
método. Para deshacerme de este error, utilicé el siguiente códigofuente