从 XQuery 重建和转换 JSON 对象

Reconstruct and transform JSON object from XQuery

是否可以在 XQuery 中重建 JSON 对象?使用 XML,可以使用计算构造函数重建元素:

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()

但这有一些明显的局限性。

这可能对您有帮助: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 有其他操作模式,也可以从您自己的模式中获取数据类型提示。但我更喜欢内置架构。

恐怕用json:object真的是这里的用法。但可能更糟,您只需要几行即可复制所有 json 属性。您也不需要那个 document{} 构造函数,也不需要转换为 json:object 的额外类型。 xdmp:from-json 已经 returns 一个 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!

我偶然发现了@paxstonhare 的这个博客 post,它使用非功能性方法,在树遍历过程中通过使用 map:put() 改变它们来重建新的 JSON 对象:

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