如何在MacOS/Linux下访问名称含点的JSON属性?
解决MacOS/Linux中用jq访问带点的JSON属性问题
这个问题的核心是本地shell的引号解析逻辑和jqplay环境不同——jqplay里的过滤器会直接传递给jq,但本地shell会先处理你输入的引号,导致jq收到的过滤器并非你预期的内容。
正确的解决方案
最可靠的方式是用单引号包裹整个jq过滤器,这样shell不会修改内部的任何字符,直接把完整的过滤器传递给jq,和jqplay的行为完全一致:
jq '."foo.bar"' file.json
你也可以用jq的方括号语法访问属性,效果完全相同:
jq '.[\"foo.bar\"]'
如果你习惯用双引号包裹过滤器,需要转义内部的双引号(告诉shell不要解析这部分引号):
jq ".\"foo.bar\"" file.json
为什么你的原命令失败?
jq ."foo.bar" file.json无输出:
shell会把."foo.bar"解析成.foo.bar(双引号内的foo.bar被视为普通字符串,和前面的.拼接)。jq收到的过滤器是.foo.bar,它会尝试访问顶级对象的foo属性,再访问其bar属性,但你的JSON中没有foo属性,只有foo.bar这个顶级属性,所以返回null,无输出。."["foo.bar"]"输出冗余内容:
shell解析后这个过滤器会变成.[foo.bar],jq会把foo.bar当成变量名(而非字符串属性名),由于foo未定义,jq会遍历所有属性,导致输出大量冗余内容。
执行正确命令后,你就能得到和jqplay完全一致的结果:
{ "one": 1, "two": "2", "three": { "a": "3a", "b": "3b" } }
内容的提问来源于stack exchange,提问作者AlanBB
相关产品推荐
相关产品推荐

