В чем разница между json.dump () и json.dumps () в Python?

131

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

Kumaran
источник

Ответы:

146

Больше нечего добавить, кроме того, что написано в документации. Если вы хотите сбросить 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.

Жоау Гонсалвеш
источник
Можете ли вы показать пример того, как использовать dump () для отправки через сокет? Я знаю, что могу использовать dumps () и encode () для преобразования в байты, но есть ли более короткий способ?
Boy
37

Функции со sстроковыми параметрами принимают. Остальные берут файловые потоки.

Pratik Gujarathi
источник
20

В использовании памяти и скорости.

Когда вы вызываете, jsonstr = json.dumps(mydata)он сначала создает полную копию ваших данных в памяти и только потом вы file.write(jsonstr)ее на диск. Так что это более быстрый метод, но может стать проблемой, если вам нужно сохранить большой кусок данных.

Когда вы вызываете json.dump(mydata, file)- без 's', новая память не используется, так как данные выгружаются порциями. Но весь процесс примерно в 2 раза медленнее.

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

JenyaKh
источник
6

Одно из заметных различий в 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 с ограничением новой строки из одного файла.

Антти Хаапала
источник
Весь текст, созданный в строковом объекте python, является Unicode, но можно ли предполагать это в целом? т.е. при загрузке содержимого из файла?
Жуан Гонсалвеш,
@ JoãoGonçalves означает, что вы не можете смешивать двоичные данные с текстом, чтобы python одобрял их молча. например json.dumps([b'123'])-> TypeError.
Антти Хаапала
@ JoãoGonçalves также обратите внимание, что строки в документах JSON должны быть в Юникоде и должны быть в любом из UTF-8, UTF-16 или UTF-32 в соответствии с RFC 7159
Антти Хаапала
1
Спасибо за это объяснение! Имеет смысл
Жуан Гонсалвеш