Сохранить результат xquery как json - PullRequest
1 голос
/ 25 июня 2019

Я использую eXist-db 4.7.0 и хочу сохранить результат XQuery в формате JSON. В настоящее время у меня есть XQuery, который возвращает JSON с использованием параметров сериализации:

xquery version "3.1";

declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";
declare namespace json = "http://www.json.org";
declare option output:method "json";
declare option output:media-type "application/json";

let $result as node() := element root {
    attribute json:array {"yes"},
    element data {
        attribute at1 {"1"},
        attribute at2 {"1"},
        element data1 {
            "test3"
        }
    }
}

return
    $result

, который возвращает хороший JSON-контент:

[
    {
        "data": {
            "at1": "1",
            "at2": "1",
            "data1": "test3"
        }
    }
]

Теперь я хочу сохранить полученный JSON непосредственно в БД. Я пытался заменить предложение return $result на

return
    xmldb:store (
        '/db/services',
        'test1.json',
        $result
    )

но результат сохраняется как

<root xmlns:json="http://www.json.org" json:array="yes">
    <data at1="1" at2="1">
        <data1>test3</data1>
    </data>
</root>

Установка типа MIME на application/json ничего не изменила:

return xmldb:store(
    '/db/services',
    'test1.json',
    $result,
    'application/json'
)

Что я пропускаю или делаю неправильно?

1 Ответ

2 голосов
/ 26 июня 2019

Ответ, удаленный его владельцем (я с радостью приму его, как только он будет восстановлен), привел меня на правильный путь: вызов fn:serialize() на $result решенпроблема (см. также блог eXist-db по поддержке XQuery 3.1 ).

Итак, изменение предложения return следующим образом решило проблему:

return
    xmldb:store(
    '/db/services',
    'test1.json',
    serialize($result, map { 'method':'json'})
)
...