Mon code:
import simplejson as json
s = "{'username':'dfdsfdsf'}" #1
#s = '{"username":"dfdsfdsf"}' #2
j = json.loads(s)
#1
définition est fausse
#2
définition est juste
On m'a dit qu'en Python, cette simple citation double pouvait être interchangeable. Quelqu'un peut-il m'expliquer cela?
Syntaxe JSON n'est pas une syntaxe Python. JSON nécessite des guillemets doubles pour ses chaînes.
vous pouvez utiliser ast.literal_eval()
>>> import ast
>>> s = "{'username':'dfdsfdsf'}"
>>> ast.literal_eval(s)
{'username': 'dfdsfdsf'}
Vous pouvez vider JSON avec une citation double en:
import json
# mixing single and double quotes
data = {'jsonKey': 'jsonValue',"title": "hello world"}
# get string with all double quotes
json_string = json.dumps(data)
demjson est également un bon paquet pour résoudre le problème de la mauvaise syntaxe json:
pip install demjson
Utilisation:
from demjson import decode
bad_json = "{'username':'dfdsfdsf'}"
python_dict = decode(bad_json)
Modifier:
demjson.decode
est un excellent outil pour les json endommagés, mais lorsque vous avez affaire à de gros fichiers json,ast.literal_eval
est une meilleure correspondance et beaucoup plus rapide.
Comme dit, JSON n'est pas la syntaxe Python. Vous devez utiliser des guillemets doubles dans JSON. Son créateur est (in) célèbre pour l'utilisation de sous-ensembles stricts de syntaxe autorisée afin de réduire la surcharge cognitive du programmeur.
C'est vraiment utile de savoir qu'il n'y a pas de guillemets simples dans une chaîne JSON. Disons que vous l'avez copié et collé à partir d'une console de navigateur/quoi que ce soit. Ensuite, vous pouvez simplement taper
a = json.loads('very_long_json_string_pasted_here')
Sinon, cela pourrait casser s'il utilisait aussi des guillemets simples.
Je me suis récemment heurté à un problème très similaire et je pense que ma solution fonctionnerait aussi pour vous. J'ai eu un fichier texte qui contenait une liste d'éléments sous la forme:
["first item", 'the "Second" item', "thi'rd", 'some \\"hellish\\" \'quoted" item']
Je voulais analyser ce qui précède dans une liste python, mais n'appréciais pas 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 à double guillemet, j'ai donc écrit mon propre lexer très simple pour ce cas particulier (branchez simplement votre propre "stringtoparse" et vous obtiendrez comme liste de sortie: "items")
#This lexer takes a JSON-like 'array' string and converts single-quoted array items into escaped double-quoted items,
#then puts the 'array' into a python list
#Issues such as ["item 1", '","item 2 including those double quotes":"', "item 3"] are resolved with this lexer
items = [] #List of lexed items
item = "" #Current item container
dq = True #Double-quotes active (False->single quotes active)
bs = 0 #backslash counter
in_item = False #True if currently lexing an item within the quotes (False if outside the quotes; ie comma and whitespace)
for c in stringtoparse[1:-1]: #Assuming encasement by brackets
if c=="\\": #if there are backslashes, count them! Odd numbers escape the quotes...
bs = bs + 1
continue
if (dq and c=='"') or (not dq and c=="'"): #quote matched at start/end of an item
if bs & 1==1: #if escaped quote, ignore as it must be part of the item
continue
else: #not escaped quote - toggle in_item
in_item = not in_item
if item!="": #if item not empty, we must be at the end
items += [item] #so add it to the list of items
item = "" #and reset for the next item
continue
if not in_item: #toggle of single/double quotes to enclose items
if dq and c=="'":
dq = False
in_item = True
Elif not dq and c=='"':
dq = True
in_item = True
continue
if in_item: #character is part of an item, append it to the item
if not dq and c=='"': #if we are using single quotes
item += bs * "\\" + "\"" #escape double quotes for JSON
else:
item += bs * "\\" + c
bs = 0
continue
J'espère que c'est utile à quelqu'un. Prendre plaisir!
import ast
answer = subprocess.check_output(PYTHON_ + command, Shell=True).strip()
print(ast.literal_eval(answer.decode(UTF_)))
Travaille pour moi