我有一个JSON数据文件(如下所示),我试图使用https://regex101.com/实用程序查找字段值。
除了字段,如果密钥名称中包含-
短划线字符,它的工作正常。
如何获取" field-2 "," field-three "的值?或" field-three.url " for 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
,这不是我想要的。
cat /tmp/my.data.json| jq ".content.book1"|egrep "short-url|field-2"
"field-2": "value-2",
"short-url": "book1/field-three/chota-chetan"
和 有人在这里做得很好:jq
答案 0 :(得分:4)
“ - ”用于jq中的否定。对于具有特殊字符(如“ - ”)的键名,不能使用简化的“.keyname”语法。有几种选择,但最强大的只是使用.["KEY NAME"]
形式,在链接时可以缩写为[“KEY NAME”],例如.a["b-c"]
是.a | .["b-c"]
的简写。
如果有疑问,请明确使用管道。
有关详细信息,请参阅jq手册和/或https://github.com/stedolan/jq/wiki/FAQ
答案 1 :(得分:1)
我不了解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'])"
答案 2 :(得分:1)
如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 :(得分:0)
嗯......花了一些时间,但最后似乎我们需要 DOUBLE QUOTE ,并且只删除包含-
名称的任何键名的双引号。< / p>
$ 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/"
OR
如果你用一个引号'
包装所有内容,那么我们不需要反斜杠"
双引号,而是在名称中使用-
的键名称使用双引号。
$ 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