【问题标题】:Parsing JSON with JQ & reconstruct JSON用 JQ 解析 JSON 并重构 JSON
【发布时间】:2020-09-11 07:10:57
【问题描述】:

对于我需要从 JSON 开始的项目,我转向 JQ,因为我的脚本的其余部分也在 bash 中。 我的主要问题是我无法解析我的输入,因为该文件由几个 JSON 组成:

{"url":"https://www.domain.tld:443","content-length":11089,"status-code":200,"location":"","title":"","vhost":false,"webserver":"Netlify","content-type":"text/html","tls":{"dns_names":["domain.tld","www.domain.tld"],"common_name":["domain.tld","Let's Encrypt Authority X3"],"organization":["Let's Encrypt"],"issuer_common_name":["Let's Encrypt Authority X3","DST Root CA X3"],"issuer_organization":["Let's Encrypt","Digital Signature Trust Co."]},"csp":{"domains":["https://www.domain.tld:443"]},"http2":false,"method":"GET"}
{"url":"http://www.domain.tld:80","content-length":37,"status-code":301,"location":"https://www.domain.tld/","title":"","vhost":false,"webserver":"Netlify","content-type":"text/plain","csp":{"domains":["https://www.domain.tld:443"]},"http2":false,"method":"GET"}
{"url":"https://domain.tld:443","content-length":37,"status-code":301,"location":"https://www.domain.tld/","title":"","vhost":false,"webserver":"Netlify","content-type":"text/plain","tls":{"dns_names":["domain.tld","www.domain.tld"],"common_name":["domain.tld","Let's Encrypt Authority X3"],"organization":["Let's Encrypt"],"issuer_common_name":["Let's Encrypt Authority X3","DST Root CA X3"],"issuer_organization":["Let's Encrypt","Digital Signature Trust Co."]},"csp":{"domains":["https://www.domain.tld:443"]},"http2":false,"method":"GET"}
{"url":"http://domain.tld:80","content-length":33,"status-code":301,"location":"https://domain.tld/","title":"","vhost":false,"webserver":"Netlify","content-type":"text/plain","csp":{"domains":["https://www.domain.tld:443"]},"http2":false,"method":"GET"}

最终目标是提取 URL、状态码和内容长度以重建 JSON 以作为 POST 发送到另一个 API。

另一个问题是我可以正确提取带有 cat file.json | jq .url 的网址,但不能正确提取带有 cat file.json | jq .status-code 的状态代码:jq: error: code/0 is not defined at <top-level>, line 1:

有什么想法吗?
谢谢

【问题讨论】:

  • 您希望重构后的 JSON 看起来如何?对于你的直接问题jq .status-code可以通过jq ."status-code"来解决
  • 也在 bash 中并通过 curl 发送,但我认为我不会有问题。我对cat file.json | jq ."status-code" 有同样的错误
  • 迭代然后做什么?你的问题不清楚
  • Akerces - 您似乎对 jq 有一个基本的误解,它是面向流的,因此能够读取(和解析)您的 JSON 对象流。正如@inian 所说,唯一的问题是您的“重建” JSON 应该是什么样子。大概这取决于接收端的 API。简而言之,您应该遵循minimal reproducible example 准则。
  • @Akerces:以正确的格式将代码添加到问题中

标签: json bash jq


【解决方案1】:

对于特殊字符问题: 您想将引用它的信息传递给 jq,因此您想绕过 bash 的引用缩减。 另外,请注意我不使用 cat,因为它在这里是不必要的:

jq '."status-code"' file.json

对于多个json字符串的问题:

之前的同一行代码,在整个文件上,给了我以下结果:

200
301
301
301

我可以是jq的版本,我的是jq-1.5-1-a5b5cbe

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多