使用 JQ 工具实用程序解析或查看 JSON 数据字段,其中字段名称在键名中具有"-"短划线



我有一个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

最新更新