2016-03-15 2 views
2

Возможно ли восстановить объект JSON в XQuery? Используя XML, можно использовать вычисляемые конструктор для восстановления элемента:Восстановить и преобразовать объект JSON из XQuery

element { node-name($some-element) } { 
    (: Do stuff with $some-element/(@*|node()) :) 
} 

Но использование объектов JSON, кажется, что это не возможно восстановить свойства. Я хотел бы сделать что-то вроде этого, но это вызывает ошибку синтаксиса:

object-node { 
    for $p in $some-json-object/* 
    return node-name($p) : $p 
} 

Похоже, это можно обойти, что на мутирует объект JSON:

let $obj := json:object(document{xdmp:from-json($json)}/*) 
let $_put := map:put($o, 'prop-name', $prop-val) 
return xdmp:to-json($o)/node() 

Но это имеет некоторые очевидные ограничения ,

ответ

1

Это может быть полезно для вас: http://docs.marklogic.com/guide/app-dev/json

Однако, я часто использую другой подход в XQuery (будучи комфортно с XML). Это может получить некоторый отход от людей здесь, но это мой подход:

Постройте, что вам нравится в XML, а затем преобразуйте его. Если вы создадите свой XML в пространстве имен http: //marklogic.com/xdmp/json/basic, вы можете просто преобразовать его в любой сложный JSON, который вы хотите, используя json:transform-to-json - так как все подсказки к типам данных находятся в атрибутах XML. Самое приятное в этом подходе - это хороший средний формат. Я могу преобразовать в JSON - или я могу применить преобразование XSLT и получить другой XML, если захочу.

Следует отметить, что json: transform-to-json имеет другие режимы работы и может также получать подсказки типов данных из вашей собственной схемы. Но я использую встроенную схему.

4

Я боюсь использовать json: объект действительно способ использования здесь. Однако может быть хуже, вам нужно всего несколько строк, чтобы скопировать все свойства json. Вам также не нужен этот конструктор document {}, а также добавление дополнительного типа в json: object. xdmp: from-json уже возвращает json: объект:

let $org := xdmp:from-json($json) 
let $new := json:object() 
let $_ := 
    for $key in map:keys($org) 
    return map:put($new, $key, map:get($org, $key)) 
return xdmp:to-json($new)/node() 

HTH!

0

я наткнулся на этот блог по @paxstonhare, которая использует не-функциональный подход, восстановление новых объектов JSON во время прогулки дерева по мутирует их с помощью map:put():

http://developer.marklogic.com/blog/walking-among-the-json-trees

Смежные вопросы