构造JSON(Constructing JSON)

编程入门 行业动态 更新时间:2024-10-28 20:17:44
构造JSON(Constructing JSON)

我的文档是XML格式,我需要根据这个文档构建一个JSON格式。 首先,我创建了一个返回正确XML结构的查询,但是当我将此查询转换为返回JSON时,我遇到了For Return问题。

Error: [1.0-ml] XDMP-UNDVAR: (err:XPST0008) Undefined variable $cat

原始查询:

let $tree := <tree>{for $cat in distinct-values($doc//ns:category/@name) return <cat name="{$cat}"> { for $var in $doc//ns:category[@name = $cat]//ns:variable/@name return <var name="{$var}"> } </var> } </cat> } </tree> return $tree

数据:

<category name="Catname"> <variable name="Varname"> <segment name="Seg1">9</segment> <segment name="Seg2">33</segment> <segment name="Seg3">32</segment> <segment name="Seg4">22</segment> </variable> <variable name="Vartwo"> <segment name="Seg2one">1</segment> <segment name="Seg2two">2</segment> </variable> </category> <category> ....

新查询:

let $tree := json:array( <json:array xmlns:json="http://marklogic.com/xdmp/json" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <json:value xsi:type="xs:string"> {for $cat in distinct-values($doc//ns:category/@name) return $cat} </json:value> <json:array> {for $var in $doc//ns:category[@name = $cat]//ns:variable/@name return $var} </json:array> </json:array> ) return $tree

预期产出

{"Catname": ["Varname": ["Seg1", "Seg2", "Seg3"], "Vartwo": ["Seg2one", "Seg2two"]]}, {"Cat2" ... }

My document is in XML and I need to construct a JSON format based on this document. First I created a query returning the right XML structure but when I convert this query to return JSON, I have a For Return problem.

Error: [1.0-ml] XDMP-UNDVAR: (err:XPST0008) Undefined variable $cat

Original query:

let $tree := <tree>{for $cat in distinct-values($doc//ns:category/@name) return <cat name="{$cat}"> { for $var in $doc//ns:category[@name = $cat]//ns:variable/@name return <var name="{$var}"> } </var> } </cat> } </tree> return $tree

Data:

<category name="Catname"> <variable name="Varname"> <segment name="Seg1">9</segment> <segment name="Seg2">33</segment> <segment name="Seg3">32</segment> <segment name="Seg4">22</segment> </variable> <variable name="Vartwo"> <segment name="Seg2one">1</segment> <segment name="Seg2two">2</segment> </variable> </category> <category> ....

New Query:

let $tree := json:array( <json:array xmlns:json="http://marklogic.com/xdmp/json" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <json:value xsi:type="xs:string"> {for $cat in distinct-values($doc//ns:category/@name) return $cat} </json:value> <json:array> {for $var in $doc//ns:category[@name = $cat]//ns:variable/@name return $var} </json:array> </json:array> ) return $tree

Expected Output

{"Catname": ["Varname": ["Seg1", "Seg2", "Seg3"], "Vartwo": ["Seg2one", "Seg2two"]]}, {"Cat2" ... }

最满意答案

您收到该错误是因为变量$cat不在嵌套<json:array/>元素的范围内。 它在前一个范围中定义,因此不可用。

我不确定你想要创建什么JSON结构,但是 使用XML序列化来创建JSON肯定很尴尬。 我更喜欢这样的方法:

更新:提供的JSON结构无效; 我冒昧地将类别属性转换为对象。 这些XQuery示例将输出JSON,如下所示:

{"Catname":{"Vartwo":["Seg2one","Seg2two"], "Varname":["Seg1","Seg2","Seg3","Seg4"]}}

此方法使用功能映射API:

let $map := map:new( for $cat in distinct-values($doc//ns:category/@name) return map:entry($cat, for $var in $doc//ns:category[@name = $cat]//ns:variable let $name := $var/@name/fn:string() return map:entry($name, json:to-array($var/ns:segment/@name/fn:string())) )) return xdmp:to-json($map)

以下是使用过程映射API的相同代码:

let $map := map:map() let $_ := for $cat in distinct-values($doc//ns:category/@name) let $cat-map := map:map() let $_ := for $var in $doc//ns:category[@name = $cat]//ns:variable let $name := $var/@name/fn:string() return map:put($cat-map, $name, json:to-array($var/ns:segment/@name/fn:string())) return map:put($map, $cat, $cat-map) return xdmp:to-json($map)

这种方法的关键点是

使用json:to-array()从XQuery序列构造数组 使用xdmp:to-json()从地图构造对象

此代码从您的示例XML返回以下JSON: {"Catname":["Varname"]} ,这似乎不太有用。 一旦添加了想要查看的输出,我就会更新。

You're getting that error because the variable $cat is not in scope inside of the nested <json:array/> element. It's defined in the previous scope, and, therefore, not available.

I'm not sure what JSON structure you want to create, but it's definitely awkward to use that XML serialization to create JSON. I prefer an approach like this:

Update: The provided JSON structure isn't valid; I've taken the liberty of converting the category property to an object. These XQuery samples will output JSON as follows:

{"Catname":{"Vartwo":["Seg2one","Seg2two"], "Varname":["Seg1","Seg2","Seg3","Seg4"]}}

This approach uses the functional maps API:

let $map := map:new( for $cat in distinct-values($doc//ns:category/@name) return map:entry($cat, for $var in $doc//ns:category[@name = $cat]//ns:variable let $name := $var/@name/fn:string() return map:entry($name, json:to-array($var/ns:segment/@name/fn:string())) )) return xdmp:to-json($map)

And here's the same code, using the procedural maps API:

let $map := map:map() let $_ := for $cat in distinct-values($doc//ns:category/@name) let $cat-map := map:map() let $_ := for $var in $doc//ns:category[@name = $cat]//ns:variable let $name := $var/@name/fn:string() return map:put($cat-map, $name, json:to-array($var/ns:segment/@name/fn:string())) return map:put($map, $cat, $cat-map) return xdmp:to-json($map)

The key takeaways from this approach are

construct arrays from XQuery sequences using json:to-array() construct objects from maps using xdmp:to-json()

This code returns the following JSON from your sample XML: {"Catname":["Varname"]}, which doesn't seem very useful. I'll update once you've added the output you want to see.

更多推荐

本文发布于:2023-08-01 10:46:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1358131.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:JSON   Constructing

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!