Mi código:
import simplejson as json
s = "{'username':'dfdsfdsf'}" #1
#s = '{"username":"dfdsfdsf"}' #2
j = json.loads(s)
#1
la definición es incorrecta
#2
la definición es correcta
Escuché que en Python las comillas simples y dobles pueden ser intercambiables. ¿Puede alguien explicarme esto?
str(dict)
y no quieroeval
hacerlo. Un simple.replace("'", '"')
debería hacer el truco.json.dumps(..)
dos veces como en: loimport json; d = dict(tags=["dog", "cat", "mouse"]); print json.dumps(json.dumps(d))
que da:"{\"tags\": [\"dog\", \"cat\", \"mouse\"]}"
puedes usar
ast.literal_eval()
fuente
{ 'a' : 'this "string" really isn\'t!!!!' }
"{'link':'<a href="mylink">http://my.com</a>'}"
? En este caso,ast.literal_eval
arroja un error de sintaxisPuede volcar JSON con comillas dobles mediante:
fuente
demjson también es un buen paquete para resolver el problema de la sintaxis json incorrecta:
Uso:
Editar:
fuente
demjson.decode
es una gran herramienta para json dañado, pero para tareas que involucran decenas o cientos de miles de paquetes json,ast.literal_eval
es mucho más rápido. Por no decirdemjson
que no tiene su lugar: lo uso como respaldo en caso de que fallen los métodos más rápidos.Dos problemas con las respuestas dadas hasta ahora, si, por ejemplo, uno transmite ese JSON no estándar. Porque entonces uno podría tener que interpretar una cadena entrante (no un diccionario de Python).
Problema 1 -
demjson
: Con Python 3.7. + Y usando conda no pude instalar demjson ya que obviamente no es compatible con Python> 3.5 actualmente. Entonces necesito una solución con medios más simples, por ejemploast
y / ojson.dumps
.Problema 2 -
ast
&json.dumps
: Si un JSON tiene comillas simples y contiene una cadena en al menos un valor, que a su vez contiene comillas simples, la única solución simple pero práctica que he encontrado es aplicar ambos:En el siguiente ejemplo asumimos que
line
es el objeto de cadena JSON entrante:Paso 1: convierta la cadena entrante en un diccionario usando
ast.literal_eval()
Paso 2: aplíquela
json.dumps
para la conversión confiable de claves y valores, pero sin tocar el contenido de los valores :json.dumps
por sí solo no haría el trabajo porque no interpreta el JSON, sino que solo ve la cadena. Similar paraast.literal_eval()
: aunque interpreta correctamente el JSON (diccionario), no convierte lo que necesitamos.fuente
Puedes arreglarlo de esa manera:
fuente
Como se dijo, JSON no es una sintaxis de Python. Debe utilizar comillas dobles en JSON. Su creador es (in) famoso por utilizar subconjuntos estrictos de sintaxis permitida para aliviar la sobrecarga cognitiva del programador.
A continuación, puede fallar si una de las cadenas JSON en sí contiene una comilla simple como lo señaló @Jiaaro. NO UTILICE. Dejado aquí como ejemplo de lo que no funciona.
Es realmente útil saber que no hay comillas simples en una cadena JSON. Digamos que lo copió y pegó desde una consola de navegador o lo que sea. Entonces, puede escribir
De lo contrario, esto podría romperse si también usa comillas simples.
fuente
{"key": "value 'with' single quotes"}
Realmente resolvió mi problema usando la función eval.
fuente
Recientemente me encontré con un problema muy similar y creo que mi solución también funcionaría para usted. Tenía un archivo de texto que contenía una lista de elementos en el formulario:
Quería analizar lo anterior en una lista de Python, pero no estaba interesado en eval () ya que no podía confiar en la entrada. Primero intenté usar JSON pero solo acepta elementos entre comillas dobles, así que escribí mi propio lexer muy simple para este caso específico (solo conecte su propio "stringtoparse" y obtendrá como lista de salida: 'elementos')
Ojalá sea útil para alguien. ¡Disfrutar!
fuente
Funciona para mi
fuente
El fragmento de código anterior debería funcionar.
fuente