Есть ли SaxParser, который читает json и запускает события, чтобы он выглядел как xml

Это было бы здорово, так как это позволило бы моему xml-материалу читать json без каких-либо изменений, кроме другого парсера sax.


person mP.    schedule 07.12.2010    source источник
comment
Зачем тебе это. Смысл json в том, чтобы не анализировать его как xml.   -  person Falmarri    schedule 07.12.2010
comment
Мне кажется разумной просьба. (@Falmarri - если бы JSON не анализировался как XML, это было бы печальным заявлением о JSON.) Однако XML и JSON достаточно различны по структуре, поэтому я действительно сомневаюсь, что вы могли бы иметь 100% совместимость кода, чтобы использовать XML -ориентированный код обработки SAX при использовании JSON. Но вы можете подойти достаточно близко в простых случаях.   -  person LarsH    schedule 07.12.2010
comment
И Xml, и Json имеют свойства и дочерние элементы. Они очень похожи, только обозначения у них разные. Оба содержат 0 или более детей и так далее. Свойства объекта json можно рассматривать как атрибуты xml и т. д.   -  person mP.    schedule 07.12.2010
comment
Я должен согласиться с Falmarri, JSON != XML, и следует приводить к эмуляции только в качестве последнего усилия, если ничего не работает. Однако, возможно, первоначальный запросчик хотел что-то вроде sax API, а не SAX API - SAX API не имеет смысла, поскольку он специфичен для xml; но подход в стиле push является общим. Но все это зависит от того, идет ли речь конкретно о SAX (простой API для XML, очень специфичный для XML) или о подходе потокового/инкрементного синтаксического анализа, который является более общим.   -  person StaxMan    schedule 07.12.2010
comment
Есть много вариантов использования. Если вы работаете с Perl, легко превратить строку JSON в глубокую структуру, которой можно легко манипулировать, но не так с Java. Ближе всего к Java подходит простая иерархическая структура, которой можно манипулировать и получать к ней доступ, как хэш Perl — это объект W3C DOM (я не считаю Map подходящей альтернативой). Таким образом, возможность анализировать JSON с помощью обработчика SAX дает вам простой механизм для построения дерева DOM из структуры JSON в Java. Помимо этого, возможность обрабатывать JSON как XML дает вам доступ к множеству других инструментов, связанных с XML, таких как XSLT.   -  person Jherico    schedule 22.12.2010
comment
@Falmarri Когда ваш файл JSON превышает 2 ГБ виртуального адресного пространства вашего 32-битного процесса.   -  person Ian Boyd    schedule 05.04.2021


Ответы (3)


Если вы имели в виду синтаксический анализатор на основе событий, то есть несколько проектов, которые делают это:

  1. #P2# <блочная цитата> #P3# #P4#
  2. #P5# <блочная цитата> #P6# #P7#
person Ryan Fernandes    schedule 07.12.2010
comment
Хорошая точка зрения; может быть, это не столько для SAX, сколько для стиля SAX (инкрементная обработка вместо древовидной модели) - person StaxMan; 07.12.2010

Я думаю, что это плохая идея - пытаться рассматривать JSON, как если бы это был XML (это то, о чем вы, по сути, спрашиваете); однако Jettison делает именно это. Он предоставляет содержимое JSON через Stax API (javax.xml.stream). И если вы действительно хотите SAX, написать оболочку из Stax в SAX также тривиально (но не наоборот).

Я также думаю, что вы могли бы получить лучшие ответы, если бы объяснили немного больше, чего вы пытаетесь достичь, помимо механизмов, которые вы надеетесь использовать. Например, существует множество инструментов привязки данных как для XML, так и для JSON; и использование таких инструментов может скрыть детали более низкого уровня намного лучше, чем использование абстракции, предназначенной для обработки одного для другого.

person StaxMan    schedule 07.12.2010
comment
Может быть хорошей идеей обрабатывать большие объекты JSON как поток, а не загружать все в память. - person Regenschein; 04.06.2014
comment
Конечно, и это то, что предлагают многие пакеты JSON: как Jackson, так и GSON имеют потоковый анализатор/генератор и даже позволяют сочетать потоковый доступ и привязку данных для частичных данных (поддеревьев). Таким образом, SAX — это всего лишь один потоковый API, и он предназначен не для JSON, а для XML. - person StaxMan; 10.06.2014
comment
Я понимаю, что этот ответ был написан много лет назад, но мне любопытно, почему вам показалось плохой идеей пытаться рассматривать JSON, как если бы это был XML? - person stakx - no longer contributing; 22.05.2016
comment
@stakx Потому что их модели данных принципиально разные: XML использует иерархическую модель для текстовых данных (текстовая разметка), модель данных на основе фреймов JSON. Это добавляет много трения; например, концепция JSON о различии массива/объекта отсутствует в XML, где все является элементом/атрибутом с текстовым содержимым, в некотором роде имеющим только объекты. Без внешних метаданных (схема или объекты прогланга) в общем случае невозможен надежный перевод между моделями. - person StaxMan; 24.05.2016
comment
@StaxMan такой перевод указан в XSLT 3.0: 22 Обработка данных JSON. Наличие потокового синтаксического анализатора, который может преобразовывать JSON в этот словарь XML, создаст мост для преобразований XSLT 2.0 через JSON, не требуя версии 3.0. - person Martynas Jusevičius; 25.03.2019
comment
@MartynasJusevičius, хотя определенно можно указать преобразование с сохранением информации, это обязательно означает добавление дополнительных, в противном случае бесполезных украшений в одном или обоих представлениях формата - также известном как franken-JSON, как в BadgerFish. Это связано с различными информационными моделями. Нельзя одновременно обрабатывать XML и JSON естественным образом, преобразовывая И сохраняя всю информацию; одна часть должна отдать. - person StaxMan; 26.03.2019
comment
@StaxMan Я не уверен, о чем вы говорите, потому что мне потребовалось несколько часов, чтобы разработать конвертер JSON в XML, который не теряет никакой информации и не требует каких-либо украшений: github.com/AtomGraph/JSON2XML Он также совместим с XML-представлением JSON XSLT 3.0, о котором я упоминал выше. - person Martynas Jusevičius; 02.04.2019
comment
@MartynasJusevičius, глядя на ваш конвертер, должно быть довольно очевидно: сопоставление добавляет ненужные в противном случае индикаторы типа (JSON не нуждается в маркерах <string>, <number> или <array> по мере его ввода), которые не должны иметь ни естественные JSON, ни естественные XML-представления логического содержимого . Это именно то, что называется franken-JSON (при переходе от xml к json); в этом все наоборот. Существует много таких сопоставлений, все они громоздки и неестественны в использовании, но если требуется преобразование любого и всего контента без потерь, необходимо. Так что это хороший пример того, что я имею в виду. - person StaxMan; 02.04.2019
comment
Помимо вашего мнения, теперь я могу преобразовать свой JSON в XLST 2.0 и обеспечить совместимость с XSLT 3.0. В чем был смысл. - person Martynas Jusevičius; 02.04.2019
comment
Если у вас есть строгие требования к использованию XSLT, это может быть хорошо. Я бы просто рекомендовал никому не делать этого по другим причинам (например, если они могут свободно выбирать инструменты): для XML следует использовать инструменты, специфичные для XML (например, XSLT). Специальные инструменты JSON для JSON. И только те вещи, которые могут правильно моделировать оба, используя соответствующие форматно-совместимые абстракции для обоих. - person StaxMan; 02.04.2019
comment
Что не так с общими преобразованиями данных? Для JSON не существует XSLT-подобного языка, поэтому его необходимо сначала преобразовать в XML. Ни в коем случае я не пишу преобразование с помощью JavaScript или другого императивного языка, когда я могу сделать это с помощью декларативной таблицы стилей XSLT, специально разработанной для преобразования данных. - person Martynas Jusevičius; 06.04.2019
comment
На самом деле теперь, когда вы полностью объяснили свой вариант использования - JSON в XML только, чтобы вы могли использовать xslt, а затем XML обратно в JSON - я не возражаю против этого. Если это так, дополнительные метаданные видны только во время обработки и не будут доступны пользователям. Если да... да, если вам нравится XSLT (и я согласен, что, похоже, нет хорошего инструмента для преобразования json), почему бы и нет? Спасибо, что уделили время: здесь я сделал несколько неверных предположений. Итак: меня беспокоит разоблачение JSON с украшениями, которые (если бы не XSLT) были посторонними. - person StaxMan; 08.04.2019

Я разработал потоковый преобразователь на основе StAX: https://github.com/AtomGraph/JSON2XML

Он считывает любые данные JSON и создает XML-представление JSON, указанное в XSLT 3.0. .

JSON2XML позволяет преобразовывать JSON с помощью XSLT даже без процессора XSLT 3.0. Вы можете просто предварительно обработать данные, используя JSON2XML перед преобразованием, и передать их, например, в таблицу стилей XSLT 2.0. Таким образом, ваша таблица стилей остается совместимой с XSLT 3.0, поскольку XML-представление точно такое же.

Обратная связь и пулл-реквесты приветствуются.

person Martynas Jusevičius    schedule 01.04.2019