Формат JSON Lines: почему jsonl лучше, чем обычный JSON для просмотра веб-страниц

Tags: JSON

Введение в форматы CSV и JSON

Формат Comma Separated Values  (CSV) является распространенным форматом обмена данными, широко используемым для представления наборов записей с одинаковым списком полей.

JavaScript Object Notation (JSON) в настоящее время де-факто стал стандартом формата обмена данными, заменив XML, который был громким модным словом в начале 2000-х годов. Это не только самоописание, но и восприятие человеком.

Давайте посмотрим примеры обоих форматов.

Вот список семей, представленных в виде данных CSV:

id,father,mother,children

1,Mark,Charlotte,1

2,John,Ann,3

3,Bob,Monika,2

CSV выглядит намного проще, чем аналог массива JSON, показанный ниже:

[

 {"id":1,"father":"Mark","mother":"Charlotte","children":1},

 {"id":2,"father":"John","mother":"Ann","children":3},

 {"id":3,"father":"Bob","mother":"Monika","children":2},

]

Но CSV ограничен для хранения двумерных нетипизированных данных. Нет никакого способа сохранить вложенные структуры или типы значений, такие как имена детей, в простом CSV.

[

 {"id":1,"father":"Mark","mother":"Charlotte","children":["Tom"]},

 {"id":2,"father":"John","mother":"Ann","children":["Jessika","Antony","Jack"]},

 {"id":3,"father":"Bob","mother":"Monika","children":["Jerry","Karol"]},

]

Представлять вложенные структуры в файлах JSON очень просто.

Почему бы просто не окружить все данные обычным массивом JSON, чтобы сам файл был - json-действительным?

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

Поскольку каждая запись в строках JSON является допустимым JSON, ее можно проанализировать или удалить как отдельный документ JSON. Например, вы можете осуществлять поиск внутри него, разбивать 10-гигабайтный файл на более мелкие файлы без разбора всего этого.

  1. Нет необходимости читать весь файл в памяти перед анализом. 2. Вы можете легко добавить дополнительные строки в файл, просто добавив их в файл. Если бы весь файл представлял собой массив JSON, вам пришлось бы проанализировать его, добавить новую строку и затем преобразовать обратно в JSON.

Поэтому нецелесообразно хранить несколько гигабайт в виде одного массива JSON. Принимая во внимание, что пользователям набора Dataflow потребуется хранить и анализировать большие объемы данных, мы реализовали экспорт в формат JSONL.

 

Строки JSON (jsonl), JSON (ndjson), разделенный символом новой строки, JSON (ldjson), разделенный строкой, - это три термина, выражающие одинаковые форматы, в основном предназначенные для потоковой передачи JSON.

Давайте посмотрим, что такое JSON Lines и как этот формат сравнивается с другими потоковыми форматами JSON.

JSON Lines против JSON

Точно такой же список семейств, выраженный в формате JSON Lines, выглядит следующим образом:

{"id":1,"father":"Mark","mother":"Charlotte","children":["Tom"]}

{"id":2,"father":"John","mother":"Ann","children":["Jessika","Antony","Jack"]}

{"id":3,"father":"Bob","mother":"Monika","children":["Jerry","Karol"]}

JSON Lines по существу состоит из нескольких строк, где каждая отдельная строка является допустимым объектом JSON, разделенных символом новой строки `\ n`.

Он не требует пользовательских парсеров. Просто прочитайте строку, проанализируйте как JSON, прочитайте строку, проанализируйте как JSON ... и так далее.

На самом деле в промышленности уже очень распространено использование jsonl

Пройдите по ссылке, чтобы найти более подробную информацию о спецификации JSON Lines.

<RS>{"id":1,"father":"Mark","mother":"Charlotte","children":["Tom"]}<LF>

<RS>{"id":2,"father":"John","mother":"Ann","children":["Jessika","Antony","Jack"]}<LF>

<RS>{"id":3,"father":"Bob","mother":"Monika","children":["Jerry","Karol"]}<LF>

 

<RS> - это заполнитель непечатаемого разделителя записей ASCII (0x1E). <LF> представляет символ перевода строки.

Формат выглядит практически идентично строкам JSON, за исключением этого специального символа в начале каждой записи.

Поскольку эти два формата настолько похожи, вы можете удивиться, почему они оба существуют?

Формат текстовых последовательностей JSON используется для контекста потоковой передачи. Таким образом, этот формат не определяет соответствующее расширение файла. Хотя спецификация формата текстовых последовательностей JSON регистрирует новое приложение мультимедийного типа MIME / json-seq. Сохранение и редактирование этого формата в текстовом редакторе сопряжено с ошибками, поскольку непечатный символ (0x1E) может быть искажен.

Вы можете рассмотреть возможность использования строк JSON в качестве альтернативы последовательно.

JSON Lines и Concatenated JSON

Другой альтернативой JSON Lines является конкатенированный JSON. В этом формате каждый текст JSON вообще не отделен друг от друга.

Вот представление  конкатенированного JSON вышеприведенного примера:

{"id":1,"father":"Mark","mother":"Charlotte","children":["Tom"]}{"id":2,"father":"John","mother":"Ann","children":["Jessika","Antony","Jack"]}{"id":3,"father":"Bob","mother":"Monika","children":["Jerry","Karol"]}

Конкатенированный JSON - это не новый формат, это просто имя для потоковой передачи нескольких объектов JSON без разделителей.

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

Форматы JSON со структурированным текстом

Если у вас большие вложенные структуры, читать текст строк JSON напрямую не рекомендуется. Используйте инструмент jq для облегчения просмотра больших структур:

grep . families.jsonl | jq

В результате вы увидите файл JSON со структурированным текстом:

{

"id": 1,

"father": "Mark",

"mother": "Charlotte",

"children": [

  "Tom"

]

}

{

"id": 2,

"father": "John",

"mother": "Ann",

"children": [

  "Jessika",

  "Antony",

  "Jack"

]

}

{

"id": 3,

"father": "Bob",

"mother": "Monika",

"children": [

  "Jerry",

  "Karol"

]

}

Заключение

Весь файл JSON Lines в целом технически больше не является допустимым JSON, поскольку содержит несколько текстов JSON.

Тот факт, что каждая новая строка означает отдельную запись, делает форматированный файл JSON Lines непрерывным. Вы можете прочитать столько строк, сколько необходимо, чтобы получить одинаковое количество записей.

No Comments

Add a Comment