问:如何防止JSONata在数组构造函数中“自动展平”数组?
给出JSON数据:
{
"w" : true,
"x":["a", "b"],
"y":[1, 2, 3],
"z": 9
}
JSONata查询似乎选择了4个值:
[$.w, $.x, $.y, $.z]
$ .x和$ .y的嵌套数组会变得扁平/内联到我的外包装器中,导致超过4个值:
[ true, "a", "b", 1, 2, 3, 9 ]
我想要达到的结果是
[ true, ["a", "b"], [1, 2, 3], 9 ]
我可以通过
实现这一目标[$.w, [$.x], [$.y], $.z]
但这需要我知道先验 $ .x和$ .y是数组。
我想选择4个值,并且结果数组恰好包含4个值,与所选值的类型无关。
有很多关于JSONata序列和数组之间相互作用的事情,我无法理解。
答案 0 :(得分:1)
与XPath / XQuery序列一样,它会将路径表达式的结果展平为输出数组。通过使用$each
高阶函数迭代对象的键/值对,可以在示例中避免这种情况。以下表达式将得到您想要的结果而不会导致结果扁平化:
$each($, function($v) {
$v
})
This只返回对象中每个属性的值。
更新:针对您更新的问题扩展此答案: 我认为这与之前的github question有关如何将几个独立查询组合到同一个问题中。这使用一个对象以与您到达的查询类似的方式保存所有查询。或许更清晰的表达是this:
{
"1": t,
"2": u.i,
"3": u.j,
"4": u.k,
"5": u.l,
"6": v
} ~> $each(λ($v){$v})
λ
只是function
的简写,如果你可以在键盘上找到它(JSONata Exerciser中的F12)。
答案 1 :(得分:0)
我正在努力重新解释我的问题,以便描述我在使用JSONata的序列式数组处理方面遇到的困难。
我需要运行多个查询才能从同一个JSON树中提取多个值。我想构造一个JSONata查询表达式,它提取 n 数据项(或运行 n 子查询)并在有序数组中返回 n 值。
This example似乎查询请求6的值,但由于数组展平,结果数组没有6个值。
This example显式地将每个查询包装在数组构造函数中,以便结果具有6个值。但是,不是数组的值包含在一个无关的值中。不合需要的阵另外,人们无法确定原始类型是什么......
This example显示了我想要完成的结果......我问了6件事,我得到了6个值。但是,我必须知道我正在获取的值的数据类型,并在数组构造函数中显式地包装数组以解决序列展平问题。
This example显示了我想要的内容。我查询了6件事,在不知道数据类型的情况下得到了6个答案。但我必须引入一个对象作为临时容器,以解决数组展平行为。
我没有找到任何允许我在查询中测试值类型的谓词...这可能让我使用?:运算符来动态决定是否在数组构造函数中包装数组。例如$ isArray($。foo)? [$ .foo]:$ .foo
问:我是否有更简单的方法(有效地)提交6"路径"查询并获取有序数组中的6个值,而不知道我查询的值的数据类型?