Как получить всю строку из документа json в jsoniq или javascript?
Я пытаюсь получить все значения строки json как одну строку. например в xquery xml
let $x := <a> welcome to the world of <b> JSONiq </b></a>
return string($x)
вернусь welcome to the world of JSONiq
что является эквивалентным результатом следующих документов в JSONiq:
let $y := {"a":"welcome to the world of ","b":" JSONiq"}
return xxxx($y)
Результат должен быть таким же welcome to the world of JSONiq
Если вы знаете, в javascript также было бы здорово.
2 ответа
Решение
Сначала вам нужно получить все значения, либо с libjn:values
или его определение, то вы можете использовать fn:string-join
чтобы получить одну строку:
Так
declare namespace libjn = "http://jsoniq.org/function-library";
let $y := {"a":"welcome to the world of ","b":" JSONiq"}
return string-join(libjn:values($y) ! string(), "")
или же
let $y := {"a":"welcome to the world of ","b":" JSONiq"}
return string-join($y() ! string($y(.)), "")
Это также может вернуть "JSONiqwelcome в мир", поскольку ключи объектов неупорядочены
Найдите рекурсивный скрипт JSONiq здесь, чтобы попробовать. Это делает просто переключение типов и рекурсивные вызовы:
declare function local:strings($v as item()) as xs:string*
{
typeswitch ($v)
case $object as object() return
for $k in jn:keys($object)
return local:strings($object($k))
case $array as array() return
for $member in jn:members($array)
return local:strings($member)
default return $v
};
let $y := {"a":"welcome to the world of", "b":" JSONiq", "x":{"d":"m"}}
return string-join(local:strings($y), "@")
"@" Предназначен только для обозначения границ, может быть заменен на "":
welcome to the world of@JSONiq@m
Герман.