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
атрибут.