JSON to XML что-то теряет?

У нас есть программа, которая принимает в качестве данных XML, JSON, SQL, OData и т. Д. Для XML мы используем Saxon и его поддержку XPath, и это прекрасно работает.

Для JSON мы используем библиотеку jsonPath, которая не так мощна, как XPath 3.1. А в некоторых угловых случаях jsonPath может показаться некрасивым.

Итак... что, если мы конвертируем полученный JSON в XML, а затем будем использовать Saxon? Есть ли ограничения у такого подхода? Существуют ли конструкции JSON, которые не конвертируются в XML, например анонимные массивы?

2 ответа

Решение

Многие люди придумали множество различных преобразований JSON в XML. Как уже указывалось, спецификации XPath 3.1 и XSLT 3.0 имеют без потерь циклическое преобразование сjson-to-xml а также xml-to-json который может обрабатывать любой JSON.

Существуют более простые преобразования, которые обрабатывают ограниченные наборы JSON, основная проблема заключается в том, как представить имена свойств JSON, которые не сопоставляются с именами XML, например { "prop 1" : "value" } представлен json-to-xml как <string key="prop 1">value</string> в то время как преобразования, пытающиеся сопоставить имя свойства с именем элемента или атрибута, либо не могут создать правильно сформированный XML (например, <prop 1>value</prop 1>) или экранировать пробел в имени элемента (например, <prop_1>value</prop_1> или какое-то шестнадцатеричное представление Unicode вставленного пробела).

В конце концов, я думаю, вы хотите выбрать недвижимость foo в { "foo" : "value" } как fooчто даст вам простое преобразование; в XPath 3.1 вам понадобится?foo для карты XDM или fn:string[@key = 'foo'] для json-to-xml формат результата.

С участием { "prop 1" : "value" } последний вид остается как fn:string[@key = 'prop 1'], то ? подход необходимо изменить на ?('prop 1') или .('prop 1'). Любое преобразование, которое выходит за пределы пробела в имени элемента, требует, чтобы вы изменили путь, например,prop_1.

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

Конечно, вы можете использовать другие преобразования JSON в XML, кроме json-to-xmlа затем использовать XPath 3.1 в любом формате XML; Я думаю, что это то, что выбрали ребята из oXygen, у них было некоторое преобразование JSON в XML до того, как XPath 3.1 предоставил его, и в основном придерживаются его, поэтому в oXygen вы можете писать выражения "пути" для JSON, так как под капотом путь оценивается против преобразования XML JSON. Я не уверен, какие усилия требуются, чтобы указать, какие значения JSON в исходном JSON были выбраны выражениями пути XPath в формате XML, что, вероятно, не так просто и просто.

Заголовок вопроса: json-to-xml() Функция в XPath 3.1 работает без потерь, за исключением того, что по умолчанию недопустимые в XML символы (такие как NUL или непарные суррогаты) заменяются символом SUB - вы можете изменить это поведение с помощью опции escape=true.

Без потерь удалось добиться некоторой платы за удобство. Например, имена свойств JSON переводятся не в имена элементов или атрибутов XML, а в значенияkey атрибут.

Другие вопросы по тегам