【发布时间】:2017-12-01 22:43:57
【问题描述】:
同名的 XML 元素和 JSON 属性可能是同级的。即:
<container>
<value>value1</value>
<value>value2</value>
</container>
和
object-node {
"value" : "value1",
"value" : "value2"
}
都是有效的,但我还没有找到一种有效的方法将一个转换为另一个。在 object-node 构造函数中动态构建属性是无效的,即:
object-node {
for $v in $values
return 'value' : $v
}
使用映射不起作用,因为重复的键名已折叠:
xdmp:to-json(map:new((
map:entry("value", "value1"),
map:entry("value", "value2")))
)
=> {"value":"value2"}
而在使用json:object时,最后一个键值是重复的:
json:object(<json:object>
<json:entry key="value">
<json:value>value1</json:value>
</json:entry>
<json:entry key="value">
<json:value>value2</json:value>
</json:entry>
</json:object>)
=> {"value":"value2", "value":"value2"}
使用+ 运算符连接映射更好,但它会将重复的键合并为一个带有值数组的单个键 ({"value":["value1", "value2"]}),这仍然不是我想要的。有没有办法在 XQuery 中动态构建同名的同级 JSON 属性?
【问题讨论】:
-
我同意 Michael Kay 的观点,并建议避免使用非唯一的属性名称。有一些方法可以让它工作,但稍后您会得到一些副作用,例如一旦保存在 MarkLogic 数据库中,更新具有非唯一属性的 JSON 文档可能会遇到困难。
-
@grtjn 是的,我同意这似乎是正确的做法。但是,MarkLogic 明确允许这种行为,而其他人似乎没有。处理重复的属性名称本来可以方便地使转换后的 JSON 文档在结构上更接近其 XML 等价物,但我会解决它。
-
MarkLogic 只容忍它,因为它不喜欢数据丢失,但这并不意味着它不介意。如前所述,您可以使用非唯一属性持久化 JSON,但每次触摸 JSON 时都必须小心处理它的方式。虽然
xdmp:unquote允许解析非唯一属性,但xdmp:from-json-string不允许,并且会抛出错误。
标签: json xquery marklogic marklogic-8