web-dev-qa-db-fra.com

Guillemets simples vs doubles en JSON

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?

81
Bin Chen

Syntaxe JSON n'est pas une syntaxe Python. JSON nécessite des guillemets doubles pour ses chaînes.

130

vous pouvez utiliser ast.literal_eval()

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

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) 
30
cowboybkit

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.

9
DhiaTN

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.

1
serv-inc

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!

1
Matt
import ast 
answer = subprocess.check_output(PYTHON_ + command, Shell=True).strip()
    print(ast.literal_eval(answer.decode(UTF_)))

Travaille pour moi 

0
vaibhav.patil