2010-11-12 14 views
62

Mi código:individuales vs comillas dobles en JSON

import simplejson as json 

s = "{'username':'dfdsfdsf'}" #1 
#s = '{"username":"dfdsfdsf"}' #2 
j = json.loads(s) 

#1 definición es incorrecta

#2 definición es correcta

me enteré de que en Python que solo comillas dobles puede ser intercambiables, puede ¿Alguien me explica esto?

Respuesta

105

JSON syntax no es la sintaxis de Python. JSON requiere comillas dobles para sus cadenas.

+2

pero la primera es una comilla simple en JSON, estoy confundido. Ese puede pasar la compilación, pero el segundo no puede. –

+3

# 1 no se carga aquí. –

+0

oh sí, lo siento, gracias. –

23

Puede volcar JSON con comillas dobles por:

from json import dumps 

#mixing single and double quotes 
data = {'jsonKey': 'jsonValue',"title": "hello world"} 

jsonString = json.dumps(data) 
#get string with all double quotes 
+4

esto va por el camino equivocado. Está serializando estructuras de datos de python a JSON; La pregunta original es sobre deserializar las estructuras de datos de JSON a Python. – tedder42

+2

La idea sería serializar el python en json con json.dumps, luego llamar a json.loads cuando está en formato str. – jheld

+2

Extrañas entender aquí. Si quieres cargar una cadena json, tiene que ser una comilla doble. Lo que estás haciendo sigue siendo dump json, no json string. – LegitMe

61

puede utilizar ast.literal_eval()

>>> import ast 
>>> s = "{'username':'dfdsfdsf'}" 
>>> ast.literal_eval(s) 
{'username': 'dfdsfdsf'} 
+2

Esto fue de gran ayuda. Muchas gracias. :) –

+1

Me gusta esta respuesta la mejor: no siempre tiene una opción: si alguien le da comillas simples, tiene comillas simples. O bien json.loads necesita un argumento adicional, o deberías usar esto. Reemplazar globalmente "'" es un desastre, ¿y qué pasa si los datos entrantes son: '{' a ':' esta 'cadena' realmente no lo es ' } ' –

5

demjson es también un buen paquete para resolver el problema de la sintaxis JSON malo:

pip install demjson 

Uso:

from demjson import decode 
bad_json = "{'username':'dfdsfdsf'}" 
python_dict = decode(bad_json) 

Editar:

demjson.decode es una gran herramienta para JSON dañado, pero cuando se trata de grandes amourt de datos JSON ast.literal_eval es un partido mejor y mucho más rápido.

+3

' 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. No quiere decir que 'demjson' no tenga su lugar: lo uso como respaldo en caso de que fallen los métodos más rápidos. – mjwunderlich

+1

Muchas gracias, no estaba al tanto. – DhiaTN

-1
import json 
data = json.dumps(list) 
print(data) 

El fragmento de código anterior debería funcionar.

+1

Puede hacer algo útil, pero no responde la pregunta que se hizo. El problema comienza con una cadena, no una lista. – Rachel

0

Como dije, JSON no es la sintaxis de Python. Necesita usar comillas dobles en JSON. Su creador es (in) famoso por usar subconjuntos estrictos de sintaxis permitida para aliviar la sobrecarga cognitiva del programador.

Es realmente útil para saber que no hay comillas simples en una cadena JSON. Digamos, lo copiaste y pegaste desde la consola del navegador/lo que sea. Luego, puede simplemente escribir

a = json.loads('very_long_json_string_pasted_here') 

Esto podría romperse si usara comillas simples, también.

Cuestiones relacionadas