Conversia json în șir de caractere în python (Programare, Python, Json, String)

BAE a intrebat.

Nu mi-am explicat clar întrebările de la început.Încercați să folosiți str() și json.dumps() atunci când convertiți json în șir de caractere în 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'}"

Întrebarea mea este:

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

Ieșirea mea așteptată: "{'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"'}'

Ieșirea mea așteptată: "{'jsonKey': 'jsonValue','title': 'hello world"'}"

Pentru mine nu este necesar să schimb din nou șirul de ieșire în json (dict).

Cum se poate face acest lucru?

Comentarii

  • A doua formă nu este JSON, în esență. – user94858581
  • Există o mare diferență atunci când aveți ghilimele simple vs. duble, încercați să încărcați cu json.loads folosind versiunea str –  > Por Padraic Cunningham.
  • json.dumps() este pentru conversia în JSON, nu din JSON în string. –  > Por Barmar.
  • str are absolut nimic cu JSON; faptul că str(somedict) seamănă oarecum cu JSON este o coincidență. str obține o reprezentare sub formă de șir de caractere a unui obiect, care poate să nu semene deloc cu JSON (de ex. pentru clasele care implementează __str__). –  > Por Colonel Treizeci și doi.
  • @BAE JSON necesită șiruri de caractere cu ghilimele duble. Șirurile cu un singur ghilimele în JSON nu sunt valide. –  > Por Colonel Treizeci și doi.
2 răspunsuri
alecxe

json.dumps() este mult mai mult decât a face un șir de caractere dintr-un obiect Python, ar produce întotdeauna un valid JSON șir de caractere (presupunând că tot ceea ce se află în interiorul obiectului este serializabil) urmând Tabelul de conversie a tipurilor.

De exemplu, dacă una dintre valori este None, valoarea str() ar produce un JSON invalid care nu poate fi încărcat:

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

Însă, în cazul în care dumps() ar converti None în null producând un șir JSON valid care poate fi încărcat:

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

Comentarii

  • De fapt, mă interesează mai mult diferența dintre ghilimelele simple și cele duble din șirul de ieșire. –  > Por BAE.
  • @BAE ei bine, în acest caz este simplu: stackoverflow.com/questions/4162642/…. –  > Por alecxe.
Eugene Primako

Există și alte diferențe. De exemplu, {'time': datetime.now()} nu poate fi serializat în JSON, dar poate fi convertit în șir de caractere. Ar trebui să folosiți unul dintre aceste instrumente în funcție de scop (adică rezultatul va fi decodificat ulterior).

Comentarii

  • De fapt, mă interesează mai mult diferența dintre ele în ceea ce privește ghilimelele simple și ghilimelele duble. –  > Por BAE.
  • Atunci alecxe ți-a răspuns. –  > Por Eugene Primako.