Відповіді:
Немає ще нічого, крім того, що говорять документи. Якщо ви хочете скинути 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
Функції з sпараметрами рядка take. Інші беруть потоки файлів.
У використанні пам'яті та швидкості.
Коли ви jsonstr = json.dumps(mydata)його зателефонуєте, спочатку створюється повна копія ваших даних у пам'яті, а вже потім ви file.write(jsonstr)їх на диску. Отже, це більш швидкий метод, але це може бути проблемою, якщо у вас є велика частина даних для економії.
Коли ви телефонуєте json.dump(mydata, file)- без 's', нова пам’ять не використовується, оскільки дані скидаються шматками. Але весь процес відбувається приблизно в 2 рази повільніше.
Джерело: Я перевірив вихідний код json.dump()і json.dumps()і також протестували обидва варіанти вимірювання часу з time.time()і спостерігаючи використання пам'яті в HTOP.
Одна помітна відмінність в 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 з одного файлу.
json.dumps([b'123'])-> TypeError.