Ich habe meine Fragen am Anfang nicht klar erklärt. Versuchen Sie, json zu verwenden str()
und json.dumps()
beim Konvertieren von json in string in Python.
>>> data = {'jsonKey': 'jsonValue',"title": "hello world"}
>>> print json.dumps(data)
{"jsonKey": "jsonValue", "title": "hello world"}
>>> print str(data)
{'jsonKey': 'jsonValue', 'title': 'hello world'}
>>> json.dumps(data)
'{"jsonKey": "jsonValue", "title": "hello world"}'
>>> str(data)
"{'jsonKey': 'jsonValue', 'title': 'hello world'}"
Meine Frage ist:
>>> data = {'jsonKey': 'jsonValue',"title": "hello world'"}
>>> str(data)
'{\'jsonKey\': \'jsonValue\', \'title\': "hello world\'"}'
>>> json.dumps(data)
'{"jsonKey": "jsonValue", "title": "hello world\'"}'
>>>
Meine erwartete Ausgabe: "{'jsonKey': 'jsonValue','title': 'hello world''}"
>>> data = {'jsonKey': 'jsonValue',"title": "hello world""}
File "<stdin>", line 1
data = {'jsonKey': 'jsonValue',"title": "hello world""}
^
SyntaxError: EOL while scanning string literal
>>> data = {'jsonKey': 'jsonValue',"title": "hello world\""}
>>> json.dumps(data)
'{"jsonKey": "jsonValue", "title": "hello world\\""}'
>>> str(data)
'{\'jsonKey\': \'jsonValue\', \'title\': \'hello world"\'}'
Meine erwartete Ausgabe: "{'jsonKey': 'jsonValue','title': 'hello world\"'}"
Es ist für mich nicht notwendig, die Ausgabezeichenfolge erneut in json (dict) zu ändern.
Wie macht man das?
json.dumps()
dient zur Konvertierung in JSON, nicht von JSON in Zeichenfolge.str
hat absolut nichts mit JSON zu tun; Die Tatsache, dass esstr(somedict)
irgendwie wie JSON aussieht, ist Zufall.str
Ruft eine Zeichenfolgendarstellung eines Objekts ab, die möglicherweise nicht wie JSON aussieht (z. B. für implementierte Klassen__str__
).Antworten:
json.dumps()
ist viel mehr als nur eine Zeichenfolge aus einem Python - Objekt zu machen, wäre es immer produziert gültigen JSON - String (alles unter der Annahme , im Innern das Objekt serialisierbar ist) die folgende Art Umrechnungstabelle .Wenn beispielsweise einer der Werte lautet
None
,str()
würde der einen ungültigen JSON erzeugen, der nicht geladen werden kann:>>> data = {'jsonKey': None} >>> str(data) "{'jsonKey': None}" >>> json.loads(str(data)) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 338, in loads return _default_decoder.decode(s) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 366, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 382, in raw_decode obj, end = self.scan_once(s, idx) ValueError: Expecting property name: line 1 column 2 (char 1)
Aber das
dumps()
würde sichNone
innull
eine gültige JSON-Zeichenfolge umwandeln , die geladen werden kann:>>> import json >>> data = {'jsonKey': None} >>> json.dumps(data) '{"jsonKey": null}' >>> json.loads(json.dumps(data)) {u'jsonKey': None}
quelle
Es gibt andere Unterschiede. Zum Beispiel
{'time': datetime.now()}
kann nicht zu JSON serialisiert werden, sondern kann in String umgewandelt werden. Sie sollten je nach Verwendungszweck eines dieser Tools verwenden (dh das Ergebnis wird später dekodiert).quelle