Konvertieren von Json in String in Python

76

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?

BAE
quelle
Die zweite Form ist im Wesentlichen nicht JSON.
Es gibt einen großen Unterschied, wenn Sie einfache oder doppelte Anführungszeichen haben. Versuchen Sie, mit json.loads mit der str-Version zu laden
Padraic Cunningham
json.dumps()dient zur Konvertierung in JSON, nicht von JSON in Zeichenfolge.
Barmar
2
strhat absolut nichts mit JSON zu tun; Die Tatsache, dass es str(somedict)irgendwie wie JSON aussieht, ist Zufall. strRuft eine Zeichenfolgendarstellung eines Objekts ab, die möglicherweise nicht wie JSON aussieht (z. B. für implementierte Klassen __str__).
Oberst zweiunddreißig
1
@BAE JSON erfordert Zeichenfolgen in doppelten Anführungszeichen. Zeichenfolgen in JSON in einfachen Anführungszeichen sind ungültig.
Oberst

Antworten:

132

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 sich Nonein nulleine 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}
Alecxe
quelle
Tatsächlich interessiert mich der Unterschied zwischen einfachem und doppeltem Anführungszeichen in der Ausgabezeichenfolge mehr.
BAE
@BAE gut, in diesem Fall ist es einfach: stackoverflow.com/questions/4162642/… .
Alecxe
1

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).

Eugene Primako
quelle
Tatsächlich interessiert mich der Unterschied zwischen einfachen und doppelten Anführungszeichen mehr.
BAE
Dann hat alecxe dir geantwortet.
Eugene Primako