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