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 に答える