2016-03-15 45 views
2

是否有可能在XQuery中重建JSON对象?使用XML,它可以使用计算的构造函数来重建一个元素:从XQuery重建和转换JSON对象

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

但是,使用JSON对象,它似乎是不可能的重构特性。我愿做这样的事情,但是,这将引发一个语法错误:即通过突变JSON对象

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

看起来它是可能的解决方法:

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,然后转换它。如果您在http:// marklogic.com/xdmp/json/basic命名空间中创建XML,则可以使用json:transform-to-json将它转换为任何复杂的JSON,因为所有对数据类型的提示都在XML。这种方法的好处是它是一个很好的中间格式。我可以转换为JSON - 或者我可以应用XSLT转换,并根据需要获取其他XML。

应该注意的是,json:transform-to-json具有其他操作模式,并且可以从您自己的模式中获取数据类型提示。但是我推荐内置的模式。

4

我害怕使用json:object真的是在这里使用的方式。可能会更糟糕,但您只需要几行即可复制所有json属性。您也不需要该文档构造函数,也不需要额外的类型转换为json:object。 xdmp:from-json已经返回一个json:object:

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!