我有一个JSON数据文件(如下所示(,我正在尝试使用jq实用程序查找字段值。
它工作正常,如果键名中包含-
破折号字符,则字段除外。
如何获取content.book1
下元素的"字段-2"、"字段-3"或">字段-three.url"的值(至少使用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"
$
附注:我已经知道egrep
所以这不是我要找的。
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/
"-"在jq中用于否定。 对于带有特殊字符(如"-"(的键名,不能使用简化的".keyname"语法。 有几种选择,但最健壮的是简单地使用形式.["KEY NAME"]
,当链接时可以缩写为 ["键名称"],例如.a["b-c"]
是.a | .["b-c"]
的简写。
如有疑问,请明确使用管道。
欲了解更多信息,请参阅jq手册和/或 https://github.com/stedolan/jq/wiki/FAQ
如 jq 手册中所述,要处理带有非标识符字符的键,例如-
您可以使用双引号。
从外壳中,如果您在过滤器周围使用单引号,这是最简单的。 例如,尝试以下命令:
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'
我不知道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'])"
嗯。花了一些时间,但最后似乎我们需要用双引号引号,并只对名称中包含-
的任何键名称的双引号进行反斜杠。
$ 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