【问题标题】:JQ issues with comments on Json fileJQ 对 Json 文件的评论问题
【发布时间】:2015-10-26 18:22:20
【问题描述】:

我正在使用 JQ https://stedolan.github.io/jq/ 在 bash 中处理我的 json 文件,当我读取 json 文件时出现错误

   parse error: Invalid numeric literal at line 2, column 5=

因为我的 json 有一些 cmets

  // comment
  "spawn": {}

有人看到我在寻找选项,但我找不到任何解决问题的选项。知道如何解决吗?

【问题讨论】:

  • 那条评论是line 2吗? "spawn" 线是line 2 吗? cmets 在 json 中甚至是合法的吗?
  • 不,Json 只是一个例子
  • 您确实意识到您不能向我们显示文字错误消息然后给我们不同的输入,对吧?一般来说,我们不可能帮助解决这个问题? (除了在这种情况下,您告诉我们您的 json 输入无效)。
  • 如果您只有在单独的行上有 cmets,那么您可以快速将它们 grep 出来 cat myjson.jsonc | grep -v "^\s*//" 。但请记住,这不会删除附加到行 "prop": 123 // this comment wont be removed 的 cmets。您可以运行grep -n "^\s*//" 来检查将要排除的内容。

标签: bash shell jq


【解决方案1】:

JSON 和 jq 不支持 JSON 输入中的 cmets(通常意义上的)。 jq FAQ 列出了许多可用于删除 cmets 的工具,包括 jsonlint、json5 和 any-json。我会推荐一个可以作为过滤器的。

有关链接和更多详细信息,请参阅https://github.com/stedolan/jq/wiki/FAQ#processing-not-quite-valid-json

【讨论】:

    【解决方案2】:

    删除它们; JSON 不支持 cmets。

    (JSON 定义为here;您可以看到语法的简要说明here。)

    【讨论】:

    • @paul 那你就不能用直接解析json的工具了。
    • 您可以将它们从jq 读取的流中删除,但是:sed '|//.*||' my.json | jq ...
    • 作为记录,使用sed 's|//.*||' 的建议很有可能在实践中发挥作用,但话又说回来,它可能不会。如果知道所有 // cmets 从第 1 列开始,那么您可以安全地使用 sed 's|^//.*||';否则,使用本页其他地方提到的工具之一会更安全。
    【解决方案3】:

    我找到了https://github.com/sindresorhus/strip-json-comments-cli,它允许你这样做:

    cat my_json_with_comments.json | strip-json-comments | jq  .
    

    【讨论】:

    • 如果不想安装npm包cat tsconfig.json | npx strip-json-comments-cli | jq | sponge tsconfig.json
    【解决方案4】:

    可以使用 sed 删除,例如删除以 '//' 开头的行:

    cat test.json | sed 's/\/\/.*//' | jq <>commands>
    

    sed 是一个传递/流编辑器,在这种情况下,它不会用任何东西 ( // ) 替换以 '//' 开头的行; '//' 必须用反斜杠字符转义,因为 '/' 被 sed 用作分隔符。

    如果要在“//”之前允许前导空格,则必须修改正则表达式

    【讨论】:

      猜你喜欢
      • 2011-09-28
      • 1970-01-01
      • 2013-06-06
      • 2012-11-26
      • 1970-01-01
      • 2011-01-16
      • 1970-01-01
      • 2014-01-02
      • 1970-01-01
      相关资源
      最近更新 更多