首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSONata防止阵列扁平

JSONata防止阵列扁平
EN

Stack Overflow用户
提问于 2018-04-04 12:09:49
回答 3查看 1.1K关注 0票数 0

问:如何防止JSONata在数组构造函数中“自动扁平”数组?

给定JSON数据:

代码语言:javascript
复制
{
  "w" : true,
  "x":["a", "b"],
  "y":[1, 2, 3],
  "z": 9
}

JSONata查询似乎选择了4个值:

代码语言:javascript
复制
[$.w, $.x, $.y, $.z]

$.x和$.y上的嵌套数组正在被扁平/内联到我的外部包装器中,从而产生超过4个值:

代码语言:javascript
复制
[ true, "a", "b", 1, 2, 3, 9 ]

我想要达到的结果是

代码语言:javascript
复制
[ true, ["a", "b"], [1, 2, 3], 9 ]

我可以通过使用

代码语言:javascript
复制
[$.w, [$.x], [$.y], $.z]

但这要求我事先知道$.x和$.y是数组。

我希望选择4个值,并让结果数组包含准确的4个值,与所选值的类型无关。

显然,关于JSONata序列和数组之间的交互,有些事情我无法理解。

EN

回答 3

Stack Overflow用户

发布于 2018-04-04 16:12:51

与XPath/XQuery序列相同的是,它会将路径表达式的结果压平到输出数组中。在您的示例中,可以通过使用$each高阶函数迭代对象的键/值对来避免这种情况。下面的表达式将得到您想要的结果而不需要任何扁平化结果:

代码语言:javascript
复制
$each($, function($v) {
  $v
})

只返回对象中每个属性的值。

UPDATE:为您更新的问题扩展这个答案:我认为这与以前关于如何将多个独立查询合并到同一个问题的github问题有关。这使用一个对象以与您到达的查询类似的方式保存所有查询。也许一个稍微清晰一些的表达应该是

代码语言:javascript
复制
{
  "1":  t,
  "2": u.i,
  "3": u.j,
  "4": u.k,
  "5": u.l,
  "6": v
} ~> $each(λ($v){$v})

λ只是function的缩写,如果你能在键盘上找到它( JSONata练习器中的F12)。

票数 1
EN

Stack Overflow用户

发布于 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个值,而不知道我正在查询的值的数据类型?

票数 0
EN

Stack Overflow用户

发布于 2021-08-27 16:04:33

在Acoleman示例的基础上,下面是传递n "query“字符串(表示路径)的一种方法:

代码语言:javascript
复制
(['t', 'u.i', 'u.j', 'u.k', 'u.l', 'v'] {
    $: $eval('$$.' & $)
}).$each(function($o) {$o})

并获得一个n结果数组及其原始数据格式:

代码语言:javascript
复制
[
  12345,
  [
    "i",
    "ii",
    "iii"
  ],
  [],
  "K",
  {
    "L": "LL"
  },
  null
]

使用$each似乎是避免任何扁平化的唯一方法.

当然,可能不是最有效的表达式,因为每个表达式都必须从数据结构根处开始的路径字符串中计算--但是这样就行了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49650674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档