Яка різниця між json.dump () та json.dumps () у python?


131

Я шукав в цьому офіційному документі, щоб знайти різницю між json.dump () та json.dumps () у python. Зрозуміло, що вони пов'язані з варіантом запису файлів.
Але в чому детальна різниця між ними та в яких ситуаціях один має більше переваги, ніж інші?

Відповіді:


146

Немає ще нічого, крім того, що говорять документи. Якщо ви хочете скинути JSON у файл / сокет чи будь-що інше, тоді вам слід перейти dump(). Якщо він вам потрібен лише як рядок (для друку, розбору чи будь-якого іншого), тоді використовуйте dumps()(dump string)

Як згадує Анті Хаапала у цій відповіді , є деякі незначні відмінності в ensure_asciiповедінці. В основному це пов'язано з тим, як працює основна write()функція, оскільки вона працює на фрагменти, а не на весь рядок. Перевірте його відповідь, щоб отримати детальнішу інформацію про це.

json.dump()

Серіалізувати obj як потік форматування JSON для fp (a .write () - підтримує файл-об'єкт

Якщо enable_ascii значення False, деякі фрагменти, записані на fp, можуть бути екземплярами Unicode

json.dumps()

Серіалізувати obj на формат JSON на формат

Якщо enable_ascii є False, результат може містити символи, що не належать до ASCII, і значення, що повертається, може бути екземпляром unicode


Чи можете ви показати приклад того, як використовувати dump () для надсилання через сокет? Я знаю, що я можу використовувати dumps () і чим encode () для перетворення в байти, але чи є коротший спосіб?
Хлопчик


20

У використанні пам'яті та швидкості.

Коли ви jsonstr = json.dumps(mydata)його зателефонуєте, спочатку створюється повна копія ваших даних у пам'яті, а вже потім ви file.write(jsonstr)їх на диску. Отже, це більш швидкий метод, але це може бути проблемою, якщо у вас є велика частина даних для економії.

Коли ви телефонуєте json.dump(mydata, file)- без 's', нова пам’ять не використовується, оскільки дані скидаються шматками. Але весь процес відбувається приблизно в 2 рази повільніше.

Джерело: Я перевірив вихідний код json.dump()і json.dumps()і також протестували обидва варіанти вимірювання часу з time.time()і спостерігаючи використання пам'яті в HTOP.


6

Одна помітна відмінність в Python 2 полягає в тому, що якщо ви використовуєте ensure_ascii=False, ви dumpбудете правильно записувати кодовані дані UTF-8 у файл (якщо ви не використовували 8-бітні рядки з розширеними символами, які не є UTF-8):

dumpsз іншого боку, з ensure_ascii=Falseможе створювати strабо unicodeпросто залежно від того, які типи використовували для рядків:

Серіалізуйте obj на формат JSON, відформатований за допомогою цієї таблиці перетворень. Якщо enable_ascii значення False, результат може містити символи, що не належать до ASCII, і значення, що повертається, може бути unicodeекземпляром .

(наголос мій). Зауважте, що це все ще може бути strекземпляром.

Таким чином, ви не можете використовувати його повернене значення для збереження структури у файл, не перевіряючи, який формат повернуто та, можливо, з ним грати unicode.encode.

Це, звичайно, вже не викликає занепокоєння в Python 3, оскільки немає більше цього 8-бітного / Unicode плутанини.


Що стосується loadvs loads, він loadвважає, що весь файл є одним документом JSON, тому ви не можете використовувати його для читання декількох документів з обмеженими новими рядками JSON з одного файлу.


Весь текст, створений в рядковому об'єкті python, є unicode, але чи безпечно це припустити? тобто при завантаженні вмісту з файлу?
Жоао Гонсалвес

@ JoãoGonçalves, це означає, що ви не можете змішувати двійкові дані з текстом, щоб python це тихо схвалював. наприклад json.dumps([b'123'])-> TypeError.
Антті Хаапала

@ JoãoGonçalves також зазначає, що рядки в документах JSON повинні бути Unicode , і вони повинні бути в будь-якому з UTF-8, UTF-16 або UTF-32 відповідно до RFC 7159
Antti Haapala

1
Дякую за це пояснення! Має сенс
Жоао Гонсалвес
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.