【问题标题】:Invalid numeric literal with jq带有 jq 的无效数字文字
【发布时间】:2017-07-08 11:31:25
【问题描述】:

我有大量来自第 3 方系统的 JSON,我想用 jq 对其进行预处理,但我在编写查询时遇到了困难,测试用例如下:

$ cat test.json
{
  "a": "b",
  "c": "d",
  "e": {
         "1": {
            "f": "g",
            "h": "i"
          }
       }
}
$ cat test.json|jq .e.1.f
jq: error: Invalid numeric literal at EOF at line 1, column 3 (while parsing '.1.') at <top-level>, line 1:
.e.1.f

如何将“g”作为我的输出?或者我如何将该 1 转换为“1”以便正确处理?

【问题讨论】:

    标签: json jq


    【解决方案1】:

    来自jq manual

    您还可以使用 .["foo"] 等语法查找对象的字段 (上面的 .foo 是这个的简写版本,但仅适用于 类似标识符的字符串)。

    如果你想要原始输出,你还需要引号并使用-r

    jq -r '.e["1"].f' test.json
    

    【讨论】:

    • 非常感谢 - 我已经尝试了一些东西,但我从来没有想过我需要使用“inside”。
    • 你也不一定需要使用方括号,可以很简单:.e."1".f
    【解决方案2】:

    我编写了一个调用 curl 命令的 shell 脚本函数,并将其通过管道传递给 jq 命令。

    function getName {
      curl http://localhost:123/getname/$1 | jq;
    }
    export -f getName
    

    当我从 CLI 运行它时,

    getName jarvis
    

    我收到了这样的回复:

    解析错误:第 1 行第 72 列的数字文字无效

    我尝试删除 | jq 从 curl 命令,我得到了没有 jq 解析的结果:

    <Map><timestamp>1234567890</timestamp><status>404</status><error>Not Found</error><message>....
    

    我首先以为我在 curl 命令中使用了错误的字符,或者我使用了函数参数 $1 错误。

    然后我计算了结果字符串中的字符数,我注意到该字符串中的第 72 个字符是“未找到”之间的空格。

    根本问题是我的 spring REST 控制器中还没有名为 getname 的方法,因此响应返回 404 Not Found。但除此之外,jq 并没有处理响应中的空白,除了输出错误消息。

    我是 jq 的新手,所以也许有办法解决空白空间问题,但那是另一天的事了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-26
      • 1970-01-01
      相关资源
      最近更新 更多