Ответы:
Больше нечего добавить, кроме того, что написано в документации. Если вы хотите сбросить JSON в файл / сокет или что-то еще, вам следует пойти с dump(). Если вам нужна только строка (для печати, анализа или чего-то еще), используйте dumps()(строка дампа)
Как упомянул Антии Хаапала в этом ответе , есть некоторые незначительные различия в ensure_asciiповедении. В основном это связано с тем, как write()работает основная функция, поскольку она работает с частями, а не со всей строкой. Проверьте его ответ, чтобы узнать об этом подробнее.
json.dump()
Сериализуйте obj как поток в формате JSON в fp (a .write () - поддерживающий файловый объект
Если sure_ascii имеет значение False, некоторые фрагменты, записанные в fp, могут быть экземплярами Unicode.
json.dumps()
Сериализовать obj в строку в формате JSON
Если sure_ascii имеет значение False, результат может содержать символы, отличные от ASCII, а возвращаемое значение может быть экземпляром Unicode.
Функции со sстроковыми параметрами принимают. Остальные берут файловые потоки.
В использовании памяти и скорости.
Когда вы вызываете, 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с другой стороны, with ensure_ascii=Falseможет создавать a strили unicodeпросто в зависимости от того, какие типы вы использовали для строк:
Сериализуйте obj в строку в формате JSON, используя эту таблицу преобразования. Если sure_ascii имеет значение False, результат может содержать символы, отличные от ASCII, а возвращаемое значение может быть
unicodeэкземпляром .
(курсив мой). Обратите внимание, что это strтоже может быть экземпляр.
Таким образом, вы не можете использовать его возвращаемое значение для сохранения структуры в файл, не проверив, какой формат был возвращен, и, возможно, поигрался с ним unicode.encode.
Это, конечно, больше не актуально для Python 3, поскольку больше нет путаницы с 8-битным / Unicode.
Что касается loadvs loads, loadсчитает, что весь файл является одним документом JSON, поэтому вы не можете использовать его для чтения нескольких документов JSON с ограничением новой строки из одного файла.
json.dumps([b'123'])-> TypeError.