【问题标题】:Parse or view JSON data fields using JQ tool utility where field names have a "-" dash in the key name使用 JQ 工具实用程序解析或查看 JSON 数据字段,其中字段名称在键名中带有“-”破折号
【发布时间】:2017-08-16 00:12:45
【问题描述】:

我有一个 JSON 数据文件(如下所示),我正在尝试使用 jq 实用程序查找字段值。

如果键名中包含- 破折号字符,则可以正常工作,但字段除外。

如何获取“field-2”、“field-three”或“field-three.url”的值对于content.book1 下的元素(至少使用jq)?

我尝试了以下方法来获取值,但是对于键名中包含破折号 - 的字段,它给了我以下错误。我试图反斜杠 - 字符,但这也没有帮助。

发现错误类型:

jq: error (at <stdin>:27): null (null) and number (2) cannot be subtracted
jq: 1 compile error

jq: error: three/0 is not defined at <top-level>

jq: error: syntax error, unexpected INVALID_CHARACTER, expecting $end (Unix shell quoting issues?) at <top-level>

jq: error: syntax error, unexpected INVALID_CHARACTER, expecting FORMAT or QQSTRING_START (Unix shell quoting issues?) at <top-level>, line 1:

命令:

$ cat /tmp/my.data.json
{
  "pages": {
    "book1": [
      "page1",
      "page2-para1",
      "page3-para1-sentence1",
      "page3-para2-sentence3-word4"
    ]
  },
  "content": {
    "book1": {
      "name": "giga",
      "url": "-",
      "field1": "value1",
      "field-2": "value-2",
      "field-three": {
        "name": "THIRD",
        "url": "book1/field-three/",
        "short-url": "book1/field-three/chota-chetan"
      },
      "authur": {
        "name": "lori CHUCK",
        "displayIndex": 4
      },
      "route": "/in-gc/hindi-chini-bhai-bhai"
    }
  }
}

$ cat /tmp/my.data.json| jq ".pages"
{
  "book1": [
    "page1",
    "page2-para1",
    "page3-para1-sentence1",
    "page3-para2-sentence3-word4"
  ]
}

$ cat /tmp/my.data.json| jq ".pages.book1[0]"
"page1"

$ cat /tmp/my.data.json| jq ".pages.book1[1]"
"page2-para1"

$ cat /tmp/my.data.json| jq ".content"
{
  "book1": {
    "name": "giga",
    "url": "-",
    "field1": "value1",
    "field-2": "value-2",
    "field-three": {
      "name": "THIRD",
      "url": "book1/field-three/"
    },
    "authur": {
      "name": "lori CHUCK",
      "displayIndex": 4
    },
    "route": "/in-gc/hindi-chini-bhai-bhai"
  }
}

$ cat /tmp/my.data.json| jq ".content.book1"
{
  "name": "giga",
  "url": "-",
  "field1": "value1",
  "field-2": "value-2",
  "field-three": {
    "name": "THIRD",
    "url": "book1/field-three/"
  },
  "authur": {
    "name": "lori CHUCK",
    "displayIndex": 4
  },
  "route": "/in-gc/hindi-chini-bhai-bhai"
}

$ cat /tmp/my.data.json| jq ".content.book1.name"
"giga"

$ cat /tmp/my.data.json| jq ".content.book1.field1"
"value1"

$ cat /tmp/my.data.json| jq ".content.book1.field-2"
jq: error (at <stdin>:27): null (null) and number (2) cannot be subtracted

$ cat /tmp/my.data.json| jq ".content.book1.field-three"
jq: error: three/0 is not defined at <top-level>, line 1:
.content.book1.field-three
jq: 1 compile error

$ cat /tmp/my.data.json| jq ".content.book1.field-three.url"
jq: error: three/0 is not defined at <top-level>, line 1:
.content.book1.field-three.url
jq: 1 compile error

$ cat /tmp/my.data.json| jq ".content.book1.field\-2"       
jq: error: syntax error, unexpected INVALID_CHARACTER, expecting $end (Unix shell quoting issues?) at <top-level>, line 1:
.content.book1.field\-2                    
jq: 1 compile error

$ cat /tmp/my.data.json| jq ".content.book1.field\\-2"
jq: error: syntax error, unexpected INVALID_CHARACTER, expecting $end (Unix shell quoting issues?) at <top-level>, line 1:
.content.book1.field\-2                    
jq: 1 compile error

$ cat /tmp/my.data.json| jq ".content.book1.'field-2'"
jq: error: syntax error, unexpected INVALID_CHARACTER, expecting FORMAT or QQSTRING_START (Unix shell quoting issues?) at <top-level>, line 1:
.content.book1.'field-2'               
jq: 1 compile error

$ cat /tmp/my.data.json| jq ".content.book1.authur"
{
  "name": "lori CHUCK",
  "displayIndex": 4
}

$ cat /tmp/my.data.json| jq ".content.book1.route"
"/in-gc/hindi-chini-bhai-bhai"

$

PS: 我已经知道egrep,所以这不是我要找的。​​p>

cat /tmp/my.data.json| jq ".content.book1"|egrep "short-url|field-2"
  "field-2": "value-2",
    "short-url": "book1/field-three/chota-chetan"

和 有人在这里做得很好:https://jqplay.org/

【问题讨论】:

标签: python json dictionary jq jsonparser


【解决方案1】:

“-”在jq中用于否定。对于带有“-”等特殊字符的键名,不能使用简化的“.keyname”语法。有几种选择,但最可靠的方法是简单地使用 .["KEY NAME"] 形式,在链接时可以缩写为 ["KEY NAME"],例如.a["b-c"].a | .["b-c"] 的简写。

如果有疑问,请明确使用管道。

更多信息,请查阅jq手册和/或https://github.com/stedolan/jq/wiki/FAQ

【讨论】:

  • 很好,我会接受这个作为答案,但感谢每一个人。
【解决方案2】:

jq manual 中所述,要处理带有非标识符字符(如-)的键,您可以使用双引号。

如果您在过滤器周围使用单引号,那么从 shell 中这是最简单的。例如,尝试以下命令:

cat /tmp/my.data.json | jq '.pages'
cat /tmp/my.data.json | jq '.pages.book1[0]'
cat /tmp/my.data.json | jq '.pages.book1[1]'
cat /tmp/my.data.json | jq '.content'
cat /tmp/my.data.json | jq '.content.book1'
cat /tmp/my.data.json | jq '.content.book1.name'
cat /tmp/my.data.json | jq '.content.book1.field1'
cat /tmp/my.data.json | jq '.content.book1."field-2"'
cat /tmp/my.data.json | jq '.content.book1."field-three"'
cat /tmp/my.data.json | jq '.content.book1."field-three".url'
cat /tmp/my.data.json | jq '.content.book1.authur'
cat /tmp/my.data.json | jq '.content.book1.route'

【讨论】:

    【解决方案3】:

    我不知道 jq,但你把 python 放在标签中:

    $ cat test.json | python -c "import sys, json; print(json.load(sys.stdin)['content']['book1']['field-three']['name'])"
    THIRD
    

    或者没有管道:

    $ python -c "import json; print(json.load(open('test.json'))['content']['book1']['field-three']['name'])"
    

    【讨论】:

    • 谢谢亚历克斯;使用 Python,我已经使用了与您说的相同的解决方案,但想知道 jq 有什么问题 :) 以及为什么这么简单的操作会出现错误
    【解决方案4】:

    嗯..花了一些时间,但最后似乎我们需要DOUBLE QUOTE它并反斜杠只是任何包含-的键名的双引号。

    $ cat /tmp/my.data.json| jq ".content.book1.\"field-2\""                    
    "value-2"
    
    $ cat /tmp/my.data.json| jq ".content.book1.\"field-three\".\"url\""  
    "book1/field-three/"
    

    或 如果您将所有内容都用单引号 ' 括起来,那么我们不需要反斜杠 " 双引号,而是对名称中包含 - 的键名使用双引号。

    $ cat /tmp/my.data.json| jq '.content.book1."field-three"."url"'  
    "book1/field-three/"
    

    希望对您有所帮助!从https://jqplay.org/得到一些帮助/提示

    查看更多信息:https://github.com/stedolan/jq/issues/38#issuecomment-9770240

    【讨论】:

      猜你喜欢
      • 2016-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-03
      • 2019-08-25
      • 2021-11-02
      • 1970-01-01
      相关资源
      最近更新 更多