2

是否可以在 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()

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

4

3 回答 3

4

恐怕使用 json:object 确实是这里的使用方式。可能更糟糕的是,您只需要几行即可复制所有 json 属性。您也不需要该 document{} 构造函数,也不需要转换为 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()

于 2016-03-15T22:08:21.017 回答
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 有其他的操作模式,也可以从你自己的模式中获取数据类型提示。但我更喜欢内置模式。

于 2016-03-15T08:02:15.350 回答
0

我偶然发现了@paxstonhare 的这篇博客文章,它使用了一种非功能性方法,在树遍历期间通过使用以下方法改变它们来重建新的 JSON 对象map:put()

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

于 2016-08-15T21:13:32.087 回答