Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从JSON中查找key的值_Json_Grep - Fatal编程技术网

从JSON中查找key的值

从JSON中查找key的值,json,grep,Json,Grep,我想从这一行JSON中提取“id”键 我相信这可以通过grep实现,但我不确定正确的方法 如果有一个更好的方式,没有依赖性,我会感兴趣 以下是我的示例输出: {"data": {"name": "test", "id": "4dCYd4W9i6gHQHvd", "domains": ["www.test.domain.com", "test.domain.com"], "serverid": "bbBdbbHF8PajW221", "ssl": null, "runtime": "php5.6"

我想从这一行JSON中提取
“id”

我相信这可以通过grep实现,但我不确定正确的方法

如果有一个更好的方式,没有依赖性,我会感兴趣

以下是我的示例输出:

{"data": {"name": "test", "id": "4dCYd4W9i6gHQHvd", "domains": ["www.test.domain.com", "test.domain.com"], "serverid": "bbBdbbHF8PajW221", "ssl": null, "runtime": "php5.6", "sysuserid": "4gm4K3lUerbSPfxz", "datecreated": 1474597357}, "actionid": "WXVAAHQDCSILMYTV"}

如果您有一个可以执行Perl兼容正则表达式(PCRE)的grep:

  • -P
    启用PCRE
  • -o
    只保留匹配项
  • “id”:*
    匹配
    “id”
    和任意数量的空格
  • \K
    将其左侧的所有内容都扔掉(“可变大小正面后视”)
  • “[^”]*”
    匹配两个引号以及它们之间的所有非引号
如果你的grep不能做到这一点,你可以使用它

$ grep -o '"id": *"[^"]*"' infile.json | grep -o '"[^"]*"$'
"4dCYd4W9i6gHQHvd"
这将使用grep两次。第一个命令的结果是
“id”:“4dCYd4W9i6gHQHvd”
;第二个命令删除除一对引号和它们之间的非引号以外的所有内容,并锚定在字符串的末尾(
$

但是,正如所指出的,您不应该为此使用grep,而应该使用能够解析JSON的工具——例如:

这只是对
数据
对象中的
id
键的简单筛选。要消除双引号,可以使用
-r
(“原始输出”)选项:

jq还可以整洁地打印JSON:

$ jq . infile.json
{
  "data": {
    "name": "test",
    "id": "4dCYd4W9i6gHQHvd",
    "domains": [
      "www.test.domain.com",
      "test.domain.com"
    ],
    "serverid": "bbBdbbHF8PajW221",
    "ssl": null,
    "runtime": "php5.6",
    "sysuserid": "4gm4K3lUerbSPfxz",
    "datecreated": 1474597357
  },
  "actionid": "WXVAAHQDCSILMYTV"
}
只需将数据传输到
jq
并按键选择即可
我发现自己最好的方法是使用python,因为它以本机方式处理JSON,并且与jq不同,现在大多数系统都预装了它:

$ python -c 'import sys, json; print(json.load(sys.stdin)["data"]["id"])' < infile.json
4dCYd4W9i6gHQHvd
$python-c'导入sys,json;打印(json.load(sys.stdin)[“data”][“id”])”
这可能会对你有所帮助:试试
grep-o-P的“id”:.*?,'json.file | sed的/“\\\”,//g'
,应该会对你有所帮助。。但是如果你能使用一些支持json的工具会更好。@BenjaminW.:
数据:
的内容不应该包含在
[]
?你可以找一些问答:,@BenjaminW。谢谢!使用grep将非常适合这种情况。这项工作
grep-o'“id”:*“[^”]*“'test.txt | grep-o'[^”]*“$”
如何删除引号,只留下ID?@petebocken您必须删除第一个命令的最后一个引号,以及第二个命令的第一个和最后一个引号:
grep-o''ID:*“[^”]*'test.txt|grep-o'[^”]*$'
@BenjaminW。我尝试了几次编辑,但由于某种原因找不到要删除的正确编辑。这非常好,谢谢!@BenjaminW。
'“id:*\K”[^“]*”
这对我来说很有效,但我如何确保从结果中删除双引号。@BenjaminW。我尝试了2 grep解决方案,它成功了:)高兴地回答这个问题,因为它使用了现有的东西。安装越来越多的设备来解决这样的问题太容易了。非常简单,但被忽略的方法!
$ jq -r '.data.id' infile.json
4dCYd4W9i6gHQHvd
$ jq . infile.json
{
  "data": {
    "name": "test",
    "id": "4dCYd4W9i6gHQHvd",
    "domains": [
      "www.test.domain.com",
      "test.domain.com"
    ],
    "serverid": "bbBdbbHF8PajW221",
    "ssl": null,
    "runtime": "php5.6",
    "sysuserid": "4gm4K3lUerbSPfxz",
    "datecreated": 1474597357
  },
  "actionid": "WXVAAHQDCSILMYTV"
}
"data": {
    "name": "test",
    "id": "4dCYd4W9i6gHQHvd",
    "domains": [
      "www.test.domain.com",
      "test.domain.com"
    ],
    "serverid": "bbBdbbHF8PajW221",
    "ssl": null,
    "runtime": "php5.6",
    "sysuserid": "4gm4K3lUerbSPfxz",
    "datecreated": 1474597357
  },
  "actionid": "WXVAAHQDCSILMYTV"
} | jq '.data.id'     

# 4dCYd4W9i6gHQHvd
$ python -c 'import sys, json; print(json.load(sys.stdin)["data"]["id"])' < infile.json
4dCYd4W9i6gHQHvd