Ответы:
Больше нечего добавить, кроме того, что написано в документации. Если вы хотите сбросить 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.
Что касается load
vs loads
, load
считает, что весь файл является одним документом JSON, поэтому вы не можете использовать его для чтения нескольких документов JSON с ограничением новой строки из одного файла.
json.dumps([b'123'])
-> TypeError
.