问:如何防止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序列和数组之间的交互,有些事情我无法理解。
发布于 2018-04-04 16:12:51
与XPath/XQuery序列相同的是,它会将路径表达式的结果压平到输出数组中。在您的示例中,可以通过使用$each高阶函数迭代对象的键/值对来避免这种情况。下面的表达式将得到您想要的结果而不需要任何扁平化结果:
$each($, function($v) {
$v
})这只返回对象中每个属性的值。
UPDATE:为您更新的问题扩展这个答案:我认为这与以前关于如何将多个独立查询合并到同一个问题的github问题有关。这使用一个对象以与您到达的查询类似的方式保存所有查询。也许一个稍微清晰一些的表达应该是这
{
"1": t,
"2": u.i,
"3": u.j,
"4": u.k,
"5": u.l,
"6": v
} ~> $each(λ($v){$v})λ只是function的缩写,如果你能在键盘上找到它( JSONata练习器中的F12)。
发布于 2018-04-05 03:36:36
我很难用这样的方式重新表述我的问题,比如描述JSONata对数组的序列处理所遇到的困难。
我需要运行几个查询来从同一个JSON树中提取几个值。我想构造一个JSONata查询表达式,它提取n个数据项(或运行n个子查询),并在有序数组中准确地返回n个值。
这个例子似乎查询请求的6个值,但是由于数组的扁平化,结果数组没有6个值。
这个例子显式地将每个查询封装在一个数组构造函数中,以便结果有6个值。但是,不属于数组的值被包装在一个无关的和不受欢迎的数组中。此外,我们无法确定原始类型是什么.
这个例子展示了我想要实现的结果.我要了6样东西,我得到了6种价值。但是,我必须知道我正在获取的值的数据类型,并显式地将数组包装在数组构造函数中--围绕序列扁平化。
这个例子展示了我想要的。我询问了6件事情,并在不知道数据类型的情况下得到了6条答案。但我必须引入一个作为临时容器的对象,以绕过数组的扁平化行为。
我没有找到任何谓词允许我测试查询中值的类型.这可能让我使用?:操作符动态地决定是否在数组构造函数中包装数组。例如$isArray( $.foo )?$.foo:$.foo
问:对于我来说,是否有更简单的方法(有效地)提交6条“路径”查询,并在一个有序数组中获取6个值,而不知道我正在查询的值的数据类型?
发布于 2021-08-27 16:04:33
在Acoleman示例的基础上,下面是传递n "query“字符串(表示路径)的一种方法:
(['t', 'u.i', 'u.j', 'u.k', 'u.l', 'v'] {
$: $eval('$$.' & $)
}).$each(function($o) {$o})并获得一个n结果数组及其原始数据格式:
[
12345,
[
"i",
"ii",
"iii"
],
[],
"K",
{
"L": "LL"
},
null
]使用$each似乎是避免任何扁平化的唯一方法.
当然,可能不是最有效的表达式,因为每个表达式都必须从数据结构根处开始的路径字符串中计算--但是这样就行了。
https://stackoverflow.com/questions/49650674
复制相似问题