使用句点筛选属性名称

  • 本文关键字:属性 筛选 句点 jq
  • 更新时间 :
  • 英文 :


如何在MacOS/Linux上访问名称中包含句点的JSON属性的值?

例如,我有一个 JSON 对象,其根属性名称包含句点。例如:

{
"foo.bar": {
"one": 1,
"two": "2",
"three": {
"a": "3a",
"b": "3b"
}
}
}

jqplay.org 筛选器."foo.bar"成功提取属性的值:

{
"one": 1,
"two": "2",
"three": {
"a": "3a",
"b": "3b"
}
}

但是,在MacOS和Linux(jq v1.5(上,相同的输入和过滤器(即jq ."foo.bar" file.json不产生任何输出。

如果我在过滤器中添加括号(即.["foo.bar"]( 我得到以下内容:

{
"foo.bar": {
"one": 1,
"two": "2",
"three": {
"a": "3a",
"b": "3b"
}
}
}
{
"one": 1,
"two": "2",
"three": {
"a": "3a",
"b": "3b"
}
}
1
"2"
{
"a": "3a",
"b": "3b"
}
"3a"
"3b"

如何在 MacOS/Linux 上复制 jqplay.org 的行为,以便访问名称中带有句点的属性?

好的,想通了...我需要将整个过滤器包装在单引号中:

jq '."foo.bar"' file.json

在命令行中,您需要转义引号或将过滤器括在单引号中。否则,shell 认为引号的存在是为了将它们括起来的字符串作为单个单词。

假设您的 JSON 存储在文件input.json中,命令行应如下所示:

cat input.json | jq ."foo.bar"

或:

cat input.json | jq '."foo.bar"'

对于这个简单的过滤器,我建议使用第二种方式(将过滤器括在撇号中(,因为它更容易阅读和理解。

最新更新