问题描述
我有一个JSON数据文件(如下所示),我正在尝试使用 jq 实用程序.
I have a JSON data file (as shown below) and I'm trying to find field values using jq utility.
除键名中包含-
破折号的字段外,其他方法都可以正常工作.
It's working fine except for fields if the key name contains a -
dash character in it.
如何获取" field-2 "," field-three "或" field-three.url "的值content.book1
下的元素(至少使用jq
)?
How can I get the values of "field-2", "field-three" or "field-three.url" for element under content.book1
(using jq
at least)?
我尝试了以下操作来获取值,但对于键名中包含短划线-
的字段,它给了我以下错误.我尝试反斜杠-
字符,但这也无济于事.
I tried the following to get the values but it's giving me the following errors for fields whose key name contains a dash -
in it's name. I tried to back slash -
character but that didn't help either.
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
,所以这不是我想要的.
PS:I already know egrep
so that's not what I'm looking for.
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/
andsomeone really did a great job here: https://jqplay.org/
推荐答案
-"用于jq的求反.对于带有特殊字符(例如-")的键名,不能使用简化的".keyname"语法.有几种选择,但最可靠的方法是使用.["KEY NAME"]
形式,当链接时,例如,可以将其缩写为["KEY NAME"]. .a["b-c"]
是.a | .["b-c"]
的简写.
"-" is used for negation in jq. For key names with special characters such as "-", one cannot use the simplified ".keyname" syntax. There are several alternatives, but the most robust is simply to use the form .["KEY NAME"]
, which can be abbreviated to ["KEY NAME"] when chained, e.g. .a["b-c"]
is shorthand for .a | .["b-c"]
.
如有疑问,请显式使用管道.
If in doubt, use the pipe explicitly.
有关更多信息,请查阅jq手册和/或 https://github.com/stedolan/jq/wiki/FAQ
For further information, please consult the jq manual and/or https://github.com/stedolan/jq/wiki/FAQ
这篇关于使用JQ工具实用程序解析或查看JSON数据字段,其中字段名称带有“-"按键名称中的破折号的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!