Как получить всю строку из документа 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

Герман.

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