使用句点

时间:2018-05-21 08:25:27

标签: 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中的行为,以便我可以访问名称中包含句点的属性?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

假设您的JSON存储在文件input.json中,命令行应该是:

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

或:

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

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