2017-12-05 3 views
0

Was ist der Unterschied zwischen der Ausgabe von str(a dictionary) und json.dumps(a dictionary)? Wenn ich sie drucke, sehen sie gleich aus. Ihre Attribute (wie dir) scheinen ebenfalls identisch zu sein (siehe unten). Aber ich weiß, dass es einen Unterschied geben muss. Kannst du es mir bitte erklären?Unterschied zwischen str (dict) und json.dumps (dict)

import json 

aDictionary= {"first": 42, "second":21} 
s = str(aDictionary) 
j = json.dumps(aDictionary) 
s == j # returns false 
dir(s) == dir(j) # returns true 
+3

'str (dict)' erzeugt kein gültiges JSON. –

+0

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

+0

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

Antwort

6

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.

+0

großartige und genaue Antwort. – ddor254

Verwandte Themen