Due problemi con le risposte fornite finora, se, ad esempio, si trasmette un JSON non standard. Perché allora si potrebbe dover interpretare una stringa in arrivo (non un dizionario Python).
Problema 1 - demjson
: con Python 3.7. + E utilizzando conda non sono stato in grado di installare demjson poiché ovviamente non supporta attualmente Python> 3.5. Quindi ho bisogno di una soluzione con mezzi più semplici, ad esempio ast
e / o json.dumps
.
Problema 2 - ast
& json.dumps
: Se un JSON è sia virgolato singolo che contiene una stringa in almeno un valore, che a sua volta contiene virgolette singole, l'unica soluzione semplice ma pratica che ho trovato è applicare entrambi:
Nell'esempio seguente si presume line
sia l'oggetto stringa JSON in arrivo:
>>> line = str({'abc':'008565','name':'xyz','description':'can control TV\'s and more'})
Passaggio 1: convertire la stringa in arrivo in un dizionario utilizzando ast.literal_eval()
Passaggio 2: applicare json.dumps
ad essa per la conversione affidabile di chiavi e valori, ma senza toccare il contenuto dei valori :
>>> import ast
>>> import json
>>> print(json.dumps(ast.literal_eval(line)))
{"abc": "008565", "name": "xyz", "description": "can control TV's and more"}
json.dumps
da solo non farebbe il lavoro perché non interpreta il JSON, ma vede solo la stringa. Simile per ast.literal_eval()
: sebbene interpreti correttamente il JSON (dizionario), non converte ciò di cui abbiamo bisogno.