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 exemple ast
et / ou json.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:
>>> line = str({'abc':'008565','name':'xyz','description':'can control TV\'s and more'})
É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 :
>>> import ast
>>> import json
>>> print(json.dumps(ast.literal_eval(line)))
{"abc": "008565", "name": "xyz", "description": "can control TV's and more"}
json.dumps
seul ne ferait pas le travail car il n'interprète pas le JSON, mais ne voit que la chaîne. Similaire pour ast.literal_eval()
: bien qu'il interprète correctement le JSON (dictionnaire), il ne convertit pas ce dont nous avons besoin.