Mon code:
import simplejson as json
s = "{'username':'dfdsfdsf'}" #1
#s = '{"username":"dfdsfdsf"}' #2
j = json.loads(s)
#1
la définition est fausse
#2
la définition est juste
J'ai entendu dire qu'en Python , les guillemets simples et doubles peuvent être interchangeables. Quelqu'un peut-il m'expliquer cela?
str(dict)
, et je ne le veux paseval
. Un simple.replace("'", '"')
devrait faire l'affaire.json.dumps(..)
deux fois comme dans:import json; d = dict(tags=["dog", "cat", "mouse"]); print json.dumps(json.dumps(d))
ce qui donne:"{\"tags\": [\"dog\", \"cat\", \"mouse\"]}"
vous pouvez utiliser
ast.literal_eval()
la source
{ 'a' : 'this "string" really isn\'t!!!!' }
"{'link':'<a href="mylink">http://my.com</a>'}"
? Dans ce cas,ast.literal_eval
lance une erreur de syntaxeVous pouvez vider JSON avec des guillemets doubles par:
la source
demjson est également un bon package pour résoudre le problème de la mauvaise syntaxe json:
Usage:
Éditer:
la source
demjson.decode
est un excellent outil pour json endommagé - mais pour les tâches impliquant des dizaines ou des centaines de milliers de paquets json,ast.literal_eval
c'est beaucoup plus rapide. Pourdemjson
ne pas dire n'a pas sa place: je l'utilise comme solution de secours en cas d'échec des méthodes plus rapides.Deux problèmes avec les réponses données jusqu'à présent, si, par exemple, on diffuse un tel JSON non standard. Car alors on pourrait avoir à interpréter une chaîne entrante (pas un dictionnaire python).
Problème 1 -
demjson
: Avec Python 3.7. + Et en utilisant conda, je n'ai pas pu installer demjson car il ne prend évidemment pas en charge Python> 3.5 actuellement. J'ai donc besoin d'une solution avec des moyens plus simples, par exempleast
et / oujson.dumps
.Problème 2 -
ast
&json.dumps
: Si un JSON est à la fois entre guillemets simples et contient une chaîne dans au moins une valeur, qui à son tour contient des guillemets simples, la seule solution simple mais pratique que j'ai trouvée est d'appliquer les deux:Dans l'exemple suivant, nous supposons qu'il
line
s'agit de l'objet de chaîne JSON entrant:Étape 1: convertissez la chaîne entrante en dictionnaire en utilisant
ast.literal_eval()
Étape 2: appliquez-
json.dumps
y pour la conversion fiable des clés et des valeurs, mais sans toucher au contenu des valeurs :json.dumps
seul ne ferait pas le travail car il n'interprète pas le JSON, mais ne voit que la chaîne. Similaire pourast.literal_eval()
: bien qu'il interprète correctement le JSON (dictionnaire), il ne convertit pas ce dont nous avons besoin.la source
Vous pouvez le réparer de cette façon:
la source
Comme dit, JSON n'est pas une syntaxe Python. Vous devez utiliser des guillemets doubles dans JSON. Son créateur est (in) célèbre pour avoir utilisé des sous-ensembles stricts de syntaxe autorisée pour soulager la surcharge cognitive du programmeur.
Ci-dessous peut échouer si l'une des chaînes JSON elle-même contient un guillemet simple comme indiqué par @Jiaaro. NE PAS UTILISER. Laissé ici comme exemple de ce qui ne fonctionne pas.
C'est vraiment utile de savoir qu'il n'y a pas de guillemets simples dans une chaîne JSON. Dites, vous l'avez copié et collé à partir d'une console de navigateur / peu importe. Ensuite, vous pouvez simplement taper
Sinon, cela pourrait également être interrompu s'il utilisait des guillemets simples.
la source
{"key": "value 'with' single quotes"}
Cela a vraiment résolu mon problème en utilisant la fonction eval.
la source
Je me suis récemment heurté à un problème très similaire et je crois que ma solution fonctionnerait aussi pour vous. J'avais un fichier texte qui contenait une liste d'éléments sous la forme:
Je voulais analyser ce qui précède dans une liste python mais je n'étais pas intéressé par eval () car je ne pouvais pas faire confiance à l'entrée. J'ai d'abord essayé d'utiliser JSON mais il n'accepte que les éléments entre guillemets, j'ai donc écrit mon propre lexer très simple pour ce cas spécifique (branchez simplement votre propre "stringtoparse" et vous obtiendrez comme liste de sortie: 'items')
Espérons que cela soit utile à quelqu'un. Prendre plaisir!
la source
Travaille pour moi
la source
L'extrait de code ci-dessus devrait fonctionner.
la source