str(aDictionary)
(sowie repr(aDictionary)
) eine Darstellung Python Ihres Wörterbuch. Diese Darstellung ist hilfreich für das Debugging und nichts mehr. Für die integrierten Typen wie Wörterbücher und Zeichenfolgen erhalten Sie eine Darstellung, die gültig ist Python Syntax. Python-Syntax und JSON-Syntax können ähnlich aussehen, sind aber nicht die gleiche Sache.
- Python verwendet einfache und doppelte Anführungszeichen für Zeichenfolgenliterale. JSON erlaubt nur doppelte Anführungszeichen.
- Python-Unicode-Zeichenfolgen verwenden
\<single letter>
, \xhh
, \uhhhh
und \Uhhhhhhhh
Escape-Sequenzen, um Unicode-Codepunkte zu codieren; Die letztere Form wird für Nicht-BMP-Codepunkte verwendet. JSON verwendet einen kleineren Bereich von -Escapezeichen sowie das \uhhhh
-Formular und codiert UTF-16-Ersatzpaare für Nicht-BMP-Codepunkte (also zwei \uhhhh
-Sequenzen pro Codepunkt).
- Python verwendet
None
Objekte, JSON verwendet null
als einen speziellen "nicht existiert" Sentinel-Wert.
- Python verwendet
True
und False
als boolesche Werte, JSON verwendet true
und false
.
- Python-Wörterbuchschlüssel können von jedem beliebigen Typ sein, JSON unterstützt nur Strings.
So str(dictionary)
wird nicht produzieren gültig JSON Ausgabe, die meiste Zeit; Nur wenn alle Ihre Schlüssel und Werte BMP-Zeichenfolgen mit mindestens einem einzelnen Anführungszeichen im Wert sind, können Sie ein Dokument erhalten, das auch als gültiger JSON-Code analysiert werden kann.
In Bezug auf Ihr spezifisches Beispiel, beachten Sie, dass str(aDictionary)
ein Dokument mit einfache Anführungszeichen erzeugt; json.loads()
kann dieses Dokument nicht geladen werden, wie die nicht gültig JSON ist:
>>> import json
>>> aDictionary = {"first": 42, "second":21}
>>> str(aDictionary)
"{'first': 42, 'second': 21}"
>>> json.loads(str(aDictionary))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/mjpieters/Development/Library/buildout.python/parts/opt/lib/python3.6/json/__init__.py", line 354, in loads
return _default_decoder.decode(s)
File "/Users/mjpieters/Development/Library/buildout.python/parts/opt/lib/python3.6/json/decoder.py", line 339, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/Users/mjpieters/Development/Library/buildout.python/parts/opt/lib/python3.6/json/decoder.py", line 355, in raw_decode
obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
Nie str(pythonobject)
als Serialisierung verwenden. Obwohl die ast.literal_eval()
function eine angemessene Anzahl von integrierten Python-Typen aus einer Zeichenfolgendarstellung laden kann, ist es viel langsamer als die Verwendung von JSON für den gleichen Job oder eine anspruchsvollere data persistence format, wenn JSON nicht Ihren Anforderungen entspricht.
'str (dict)' erzeugt kein gültiges JSON. –
Danke für Ihren Kommentar. Ja, ich habe das erlebt, aber ich möchte den Unterschied zwischen zwei Dingen, die sonst sehr ähnlich aussehen, besser verstehen. – hartmut
Verwenden Sie nicht 'dict' als Variablennamen. Und wenn Sie die Ergebnisse drucken, würden Sie den Unterschied sehen; aus 'str':' "{'first': 42, 'second': 21}" 'und aus json:' '{"first": 42, "second": 21}' '. Beachten Sie die Anführungszeichen um die Zeichenfolgen für Schlüssel. – roganjosh