You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

为什么你的原命令失败?

  1. jq ."foo.bar" file.json无输出:
    shell会把."foo.bar"解析成.foo.bar(双引号内的foo.bar被视为普通字符串,和前面的.拼接)。jq收到的过滤器是.foo.bar,它会尝试访问顶级对象的foo属性,再访问其bar属性,但你的JSON中没有foo属性,只有foo.bar这个顶级属性,所以返回null,无输出。

  2. ."["foo.bar"]"输出冗余内容:
    shell解析后这个过滤器会变成.[foo.bar],jq会把foo.bar当成变量名(而非字符串属性名),由于foo未定义,jq会遍历所有属性,导致输出大量冗余内容。

执行正确命令后,你就能得到和jqplay完全一致的结果:

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

内容的提问来源于stack exchange,提问作者AlanBB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:30:00