2016-03-17 5 views

Odpowiedz

43

Nie ma prawie nic więcej do dodania innych niż to, co mówią doktorzy, jeśli chcesz zrzucić JSON do pliku/gniazda lub cokolwiek innego, to powinieneś pójść na dump(). Jeśli tylko jest to potrzebne jako ciąg znaków (do drukowania, analizowania lub cokolwiek), a następnie użyć dumps() (ciąg zrzutu)

Jak wspomniano przez Antii Haapala in this answer, istnieją pewne drobne różnice w zachowaniu ensure_ascii, jest to głównie ze względu na to, jak bazowego Funkcja write() działa, ponieważ działa w porcjach, a nie w całym ciągu, sprawdź odpowiedź, aby uzyskać więcej informacji na ten temat.

json.dump()

Serializować obj jako JSON sformatowane strumienia FP (A .write() - nośnej plikopodobny Przedmiotem

Jeśli ensure_ascii False, niektóre fragmenty napisane FP mogą unicode przypadki

json.dumps()

Serializować obj do JSON sformatowanym Str

Jeśli ensure_ascii jest False, wynik może zawierać znaków spoza ASCII i zwracana wartość może być Unicode instancję

11

Funkcje z s parametrów odbioru smyczkowych. Inni pobierają strumienie plików .

4

Jedną z istotnych różnic w Python 2 jest to, że jeśli używasz ensure_ascii=False, dump będzie poprawnie napisać kodowanie UTF-8 danych do pliku (chyba że używany 8-bitowe ciągi znaków z rozszerzonego, które nie są w UTF-8):

dumps z drugiej strony, z ensure_ascii=False może produkować str lub unicode tylko w zależności od rodzaju, który wykorzystano do strun:

Serializować oBJ do JSON sformatowanym Str korzystających z tej tabeli konwersji . Jeśli parametr sure_ascii ma wartość False, wynik może zawierać znaki spoza ASCII, a wartość zwracana może być instancją unicode.

(podkreślenie moje). Zauważ, że nadal może to być instancja str.

W ten sposób nie można użyć jego wartości zwracanej do zapisania struktury w pliku bez sprawdzenia, który format został zwrócony i prawdopodobnie odtwarzany z unicode.encode.

To oczywiście nie jest już problemem w Pythonie 3, ponieważ nie ma więcej tego zamieszania 8-bitowego/Unicode.


chodzi o load vs loads, load uważa plik cały być jeden dokument JSON, więc nie można go używać do odczytu wielu nowej linii ograniczone dokumentów JSON z pojedynczego pliku.

+0

Cały tekst utworzony w obiekcie napisowym Python ma unikod, ale czy można go bezpiecznie założyć w sposób ogólny? tj. podczas ładowania zawartości z pliku? –

+0

@ JoãoGonçalves oznacza to, że nie można mieszać danych binarnych z tekstem, aby python zatwierdzał je w trybie cichym. na przykład 'json.dumps ([b'123 '])' -> 'TypeError'. –

+0

@ JoãoGonçalves również zauważyć, że ciągi w dokumentach JSON ** muszą być Unicode ** i ** muszą być ** w dowolnym UTF-8, UTF-16 lub UTF-32 zgodnie z RFC 7159 –

Powiązane problemy