Компактное двоичное представление json

Существуют ли какие-нибудь компактные двоичные представления JSON? Я знаю, что BSON, но даже на этой веб-странице говорится: "Во многих случаях это не намного эффективнее JSON. В некоторых случаях BSON использует даже больше пространства, чем JSON".

Я ищу формат, максимально компактный, желательно какой-то открытый стандарт?

Ответ 1

Да: Smile формат данных. Это относительно новый формат передачи данных, имеет публичную реализацию Java, версию C в работах в github (libsmile). Он имеет преимущество быть более компактным, чем JSON (надежно), но на 100% совместимой логической модели данных, поэтому легко и легко конвертировать туда и обратно с текстовым JSON.

Для производительности вы можете увидеть jvm-serializers, где улыбка хорошо конкурирует с другими бинарными форматами (бережливость, avro, protobuf); это не самый компактный (поскольку он сохраняет имена полей), но намного лучше работает с потоками данных, где имена повторяются.

Он используется некоторыми проектами (например, Elastic Search, Protostuff-rpc поддерживает его), хотя и не так широко, как сказать Thrift.

EDIT (декабрь 2011 г.) - теперь есть также привязки libsmile для PHP, Ruby и Python, поэтому поддержка языка улучшается. Кроме того, существуют измерения размера данных; и хотя для альтернативных данных с одной записью (Avro, protobuf) более компактны, для потоков данных Smile часто более компактен из-за ссылки на ключ и значение String.

Ответ 2

Вы можете взглянуть на Универсальную двоичную спецификацию JSON. Он не будет столь же компактным, как Smile, потому что он не ссылается на имена, но на 100% совместим с JSON (где BSON и BJSON определяют структуры данных, которых нет в JSON, поэтому нет стандартного преобразования в/от).

Также (намеренно) преступно просто читать и писать со стандартным форматом:

[type, 1-byte char]([length, 4-byte int32])([data])

Такие простые типы данных начинаются с кода маркера ASCII, такого как "I" для 32-битного int, "T" для true, "Z" для нулевого значения, "S" для строки и т.д.

Формат разработан с учетом того, что он быстро читается, поскольку все структуры данных имеют префикс их размера, поэтому нет сканирования для последовательностей с нулевым завершением.

Например, чтение строки, которая может быть демаркирована следующим образом ([] -chars предназначены только для иллюстрации, они не записаны в формате)

[S][512][this is a really long 512-byte UTF-8 string....]

Вы увидите "S", включите его для обработки строки, см. целое число из 4 байтов, которое следует за ним "512", и знайте, что вы можете просто захватить один кусок следующих 512 байтов и декодировать их обратно к строке.

Аналогично, числовые значения выписываются без значения длины, чтобы быть более компактными, потому что их тип (byte, int32, int64, double) определяет их длину байтов (1, 4, 8 и 8 соответственно). произвольно длинные номера, которые чрезвычайно переносимы даже на платформах, которые их не поддерживают).

В среднем вы должны увидеть уменьшение размера примерно на 30% с помощью хорошо сбалансированного объекта JSON (много смешанных типов). Если вы хотите точно знать, как некоторые структуры сжимают или не сжимают, вы можете проверить раздел Требования к размерам, чтобы получить представление.

С яркой стороны, независимо от сжатия, данные будут записаны в более оптимизированном формате и будут работать быстрее.

Я проверил основные реализации ввода/выводаStream для чтения/записи формата в GitHub сегодня. На этой неделе я буду проверять отображение объектов на основе отражения.

Вы можете просто посмотреть на эти два класса, чтобы посмотреть, как читать и писать формат, я думаю, что основная логика - это что-то вроде 20 строк кода. Классы более длинны из-за абстракций к методам и некоторого структурирования вокруг проверки байтов маркера, чтобы убедиться, что файл данных является допустимым форматом; такие вещи.

Если у вас есть конкретные вопросы, такие как endianness (Big) спецификационного или числового формата для парных разрядов (IEEE 754), все это описано в спецификации или просто спросите меня.

Надеюсь, что это поможет!

Ответ 3

gzipping данные JSON помогут вам получить хорошие коэффициенты сжатия с минимальными усилиями из-за своей универсальной поддержки. Кроме того, если вы находитесь в среде браузера, вы можете заплатить большую байтовую стоимость в размере зависимости от новой библиотеки, чем в реальной экономии полезной нагрузки.

Если ваши данные имеют дополнительные ограничения (например, множество избыточных значений полей), вы можете оптимизировать, просмотрев другой протокол сериализации, а не придерживаться JSON. Пример: сериализация на основе столбцов, такая как Avro предстоящее хранилище столбцов, может дать вам лучшие коэффициенты (для хранения на диске). Если ваша полезная нагрузка содержит множество постоянных значений (например, столбцы, представляющие перечисления), может быть полезен подход сжатия словаря.

Ответ 4

Другой альтернативой, которая должна быть рассмотрена в наши дни, является CBOR (RFC 7049), в которой явно JSON-совместимая модель с большой гибкостью, Он стабилен и соответствует вашей стандартной квалификации, и, очевидно, он много думал о нем.

Ответ 5

Вы пробовали BJSON?

Ответ 6

Попытайтесь использовать js-inflate для создания и удаления снимков.

https://github.com/augustl/js-inflate

Это прекрасно, и я много использую.