2016-01-04 15 views
16

Na początku nie wyjaśniłem dokładnie moich pytań. Spróbuj użyć funkcji str() i json.dumps() podczas konwertowania json na ciąg znaków w pythonie.Konwersja json na ciąg w pytonie

>>> 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'}" 

Moje pytanie brzmi:

>>> data = {'jsonKey': 'jsonValue',"title": "hello world'"} 
>>> str(data) 
'{\'jsonKey\': \'jsonValue\', \'title\': "hello world\'"}' 
>>> json.dumps(data) 
'{"jsonKey": "jsonValue", "title": "hello world\'"}' 
>>> 

Moje oczekiwany wynik: "{ '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"\'}' 

Moje oczekiwane wyniki: "{'jsonKey': 'jsonValue', 'title': 'hello world \"'} "

PS: Zmiana ciągów wyjściowych na json (dict) aga nie jest konieczna dla mnie.

Jak to zrobić? Dzięki.

+0

Druga forma nie jest zasadniczo JSON. – Tibo

+0

Istnieje duża różnica, gdy masz pojedynczy vs cudzysłowach, wkładaj z json.loads użyciu wersji Str –

+0

'json.dumps()' jest do konwersji ** ** do JSON, a nie z JSON do łańcucha. – Barmar

Odpowiedz

29

json.dumps() jest o wiele więcej niż tylko wykonywanie ciąg z obiektu Pythona, to zawsze wytwarzają ważny JSON ciąg (zakładając, że wszystko wewnątrz obiekt jest możliwy do serializacji) po Type Conversion Table.

Na przykład, jeżeli jedna z wartości jest None The str() przyniosłoby nieprawidłową JSON, które nie mogą być załadowane:

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

Ale dumps() będzie konwertować None do null podejmowania prawidłowy ciąg JSON, które mogą być załadowano:

>>> import json 
>>> data = {'jsonKey': None} 
>>> json.dumps(data) 
'{"jsonKey": null}' 
>>> json.loads(json.dumps(data)) 
{u'jsonKey': None} 
+0

W rzeczywistości bardziej interesuje mnie ich różnica w pojedynczym cudzysłowie i podwójnym cudzysłowie w ciągu wyjściowym. – BAE

+0

@BAE dobrze, w tym przypadku jest to proste: http://stackoverflow.com/questions/4162642/python-single-vs-double-quotes-in-json. – alecxe

1

Istnieją inne różnice. Na przykład: {'time': datetime.now()} nie może zostać przekształcone do postaci szeregowej na JSON, ale może zostać przekonwertowane na ciąg znaków. Powinieneś użyć jednego z tych narzędzi w zależności od celu (tzn. Wynik zostanie później zdekodowany).

+0

W rzeczywistości bardziej interesuje mnie ich różnica w pojedynczych cudzysłowach i podwójnych cudzysłowach. – BAE

+0

Wtedy alecxe odpowiedział ci. –