首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用JQ扁平JSON行数组

用JQ扁平JSON行数组
EN

Unix & Linux用户
提问于 2021-06-12 18:38:46
回答 2查看 11.7K关注 0票数 6

我会写

代码语言:javascript
复制
> echo '{"a": "arbiter", "b": "brisk"}{"a": "astound", "b": "bistro"}' | jq '.a, .b'
"arbiter"
"brisk"
"astound"
"bistro"

但如果我做了

代码语言:javascript
复制
> echo '{"a": "arbiter", "b": "brisk", "c": ["cloak", "conceal"]} {"a": "astound", "b": "bistro", "c": ["confer", "consider"]}' | jq '.a, .b, .c'

我得到了

代码语言:javascript
复制
"arbiter"
"brisk"
[
    "cloak",
    "conceal"
]
"astound"
"bistro"
[
    "confer",
    "consider"
]

如何将c数组扁平化以代替

代码语言:javascript
复制
"arbiter"
"brisk"
"cloak",
"conceal"
"astound"
"bistro"
"confer",
"consider"

<#>更新

由于零安全性在几种现代语言中相当流行(这是有道理的),所以不妨假设上面提出的问题是不完整的。有必要知道如何处理缺少值的问题。

如果其中一个值是null

代码语言:javascript
复制
> echo '{"b": "brisk"}{"a": "astound", "b": "bistro"}' | jq '.a, .b'

我们在输出中得到一个null

代码语言:javascript
复制
null
"brisk"
"astound"
"bistro"

这很可能是我们想要的。我们可以增加第二步(小心不要排除"null"),但如果jq本身排除了nulls,那就更干净了。只写select(.a != null)就行了,但引入了{}级别。从nulls内部抛弃S的正确方法是什么?

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2021-06-12 21:57:56

jq表达式

代码语言:javascript
复制
[.a, .b, .c]

从输入对象中提取我们想要的所有元素,并将它们放在数组中。其中一些元素可能是数组,因此我们需要将所有元素都扁平化:

代码语言:javascript
复制
[.a, .b, .c] | flatten

对于输入对象

代码语言:javascript
复制
{
  "a": "arbiter",
  "b": "brisk",
  "c": [
    "cloak",
    "conceal"
  ]
}

这将生成数组。

代码语言:javascript
复制
[
  "arbiter",
  "brisk",
  "cloak",
  "conceal"
]

然后,您将得到一个类似但独立于第二个对象的数组。

要将这两个数组合并为一个,我们可以简单地通过.[]传递数据,但是编写flatten | .[]的一种快捷方法是flatten[]。利用这个,我们到达

代码语言:javascript
复制
[.a, .b, .c] | flatten[]

摘要:

代码语言:javascript
复制
echo '...as in the question...' |
jq '[.a, .b, .c] | flatten[]'

如果您还想清除任何null值,通过select(. != null)进行筛选,或者使用[.a//empty,.b//empty,.c//emtpy]提取值,或者在flatten[]之前通过map(.//empty)进行筛选。

作为注释:您的输入JSON是使用问题中的一个简单的echo创建的。但是,要在命令行上正确地创建JSON,请考虑使用像jo这样的工具,该工具还将适当地编码数据,以便包含在JSON文档中:

可以使用两个jo调用创建第二个示例JSON

代码语言:javascript
复制
jo a=arbiter b=brisk  'c[]'=cloak  'c[]'=conceal
jo a=astound b=bistro 'c[]'=confer 'c[]'=consider
票数 6
EN

Unix & Linux用户

发布于 2021-06-12 19:04:24

好吧,那是相当微不足道的。不需要Python的讨人喜欢的JSON库,甚至不需要使用awk或sed的泛泛性来降低这个库的水平。这就足以写:

代码语言:javascript
复制
> echo '{"a": "arbiter", "b": "brisk", "c": ["cloak", "conceal"]} {"a": "astound", "b": "bistro", "c": ["confer", "consider"]}' | jq '.a, .b, .c[]'

我们得到:

代码语言:javascript
复制
"arbiter"
"brisk"
"cloak"
"conceal"
"astound"
"bistro"
"confer"
"consider"
票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/654014

复制
相关文章

相似问题

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