Есть ли потоковый API для JSON?
Является ли DOM единственным способом анализа JSON?
11 ответов
Некоторые парсеры JSON предлагают инкрементный ("потоковый") парсер; для Java, по крайней мере, следующие парсеры со страницы json.org предлагают такой интерфейс:
- Джексон (тянуть интерфейс)
- Json-simple (push-интерфейс в стиле SAX)
(в дополнение к парсеру Software Monkey, на который ссылается другой ответ)
На самом деле, довольно странно, что так много парсеров JSON НЕ предлагают этот простой низкоуровневый интерфейс - в конце концов, им уже нужно реализовать низкоуровневый синтаксический анализ, так почему бы не раскрыть его.
РЕДАКТИРОВАТЬ (июнь 2011 г.): у Gson также есть собственный потоковый API (с gson 1.6)
Под DOM я предполагаю, что вы имеете в виду, что синтаксический анализатор читает весь документ сразу, прежде чем вы сможете работать с ним. Обратите внимание, что выражение DOM в наши дни подразумевает XML, но IMO - это не совсем точный вывод.
Итак, в ответ на ваши вопросы - "Да", есть потоковые API и "Нет", DOM - не единственный способ. Тем не менее, обработка документа JSON в виде потока часто проблематична, поскольку многие объекты не являются простыми парами полей / значений, но содержат другие объекты в качестве значений, которые необходимо проанализировать для обработки, и это в конечном итоге приводит к рекурсивности. Но для простых сообщений вы можете делать полезные вещи с помощью анализатора потока / событий.
Я написал синтаксический анализатор событий для JSON (это был один класс, около 700 строк). Но большинство других, которые я видел, ориентированы на документы. Один из слоев, которые я построил поверх моего анализатора, - это программа чтения документов, которая заняла около 30 LOC. Я только когда-либо использовал свой парсер на практике в качестве загрузчика документов (по вышеуказанной причине).
Я уверен, что если вы будете искать в сети, вы найдете парсеры на основе push и push для JSON.
РЕДАКТИРОВАТЬ: я разместил парсер на моем сайте для скачивания. Рабочий компилируемый класс и полный пример включены.
РЕДАКТИРОВАТЬ 2: Вы также хотите посмотреть на сайте JSON.
Как упомянул stefanB, http://lloyd.github.com/yajl/ - это библиотека C для потокового анализа JSON. На этой странице также упоминается много оберток для других языков:
- yajl-ruby - рубиновые привязки для YAJL
- yajl-objc - привязки Objective C для YAJL
- Привязки YAJL IO (для языка IO)
- Привязки Python бывают двух видов: py-yajl ИЛИ yajl-py
- yajl-js - привязки к node.js (отражаются на github).
- луа-йаджл - привязки луа
- оо-йайл - ооо привязки
- yajl-tcl - привязки tcl
некоторые из них могут не разрешать потоковую передачу, но многие из них, безусловно, разрешают.
Отказ от ответственности: я предлагаю свой собственный проект.
Я поддерживаю потоковый анализатор JSON в Javascript, который сочетает в себе некоторые функции SAX и DOM:
Идея состоит в том, чтобы разрешить потоковый анализ, но не требовать от программиста прослушивания множества различных событий, как в случае с SAX. Мне нравится SAX, но он, как правило, довольно низкий уровень для того, что нужно большинству людей. Вы можете прослушать любой интересующий узел из потока JSON, зарегистрировав шаблоны JSONPath.
Код на Github здесь:
Если вы хотите использовать чистый javascript и библиотеку, которая работает как в node.js, так и в браузере, вы можете попробовать кларнет:
https://github.com/dscape/clarinet
Парсер основан на событиях, и, поскольку он потоковый, он позволяет работать с огромными файлами. API очень близок к sax, а код разветвляется из sax-js.
Если вы ищете именно Python, то ijson утверждает, что поддерживает его. Тем не менее, это всего лишь синтаксический анализатор, поэтому я не сталкивался с тем, что Python может генерировать JSON в виде потока.
Для C++ существует rapidjson, который утверждает, что поддерживает как разбор, так и генерацию в потоковом режиме.
Вот библиотека NodeJS NPM для анализа и обработки потоков JSON: https://npmjs.org/package/JSONStream
LitJSON поддерживает потоковый API. Цитирование из руководства:
"Альтернативный интерфейс для обработки данных JSON, который может быть знаком некоторым разработчикам, - это использование классов, которые позволяют считывать и записывать данные потоковым способом. Эти классы JsonReader
а также JsonWriter
,
"Эти два типа на самом деле являются основой этой библиотеки, и JsonMapper
Тип построен на их основе, так что в некотором роде разработчик может рассматривать классы чтения и записи как низкоуровневый интерфейс программирования для LitJSON."
Для Python альтернативой (очевидно, более легкой и более эффективной) ijson является jsaone (см. Эту ссылку для приблизительных тестов, показывающих, что jsaone примерно в 3 раза быстрее).
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я являюсь автором jsaone, и тесты, которые я сделал, очень просты... Я буду счастлив, что оказался неправ!
Отвечая на вопрос: YAJL библиотека синтаксического анализатора JSON на C:
YAJL запоминает все состояния, необходимые для поддержки повторного запуска анализа. Это позволяет выполнять синтаксический анализ при считывании данных с диска или сети.
Поэтому я думаю, что использование yajl для анализа JSON можно рассматривать как поток обработки данных.
В ответ на ваш второй вопрос нет, во многих языках есть парсеры JSON. PHP, Java, C, Ruby и многие другие. Просто Google для языка на ваш выбор плюс "JSON парсер".