【问题标题】:Parsing json file with nested objects使用嵌套对象解析 json 文件
【发布时间】:2021-01-27 17:35:45
【问题描述】:

我想请你帮忙。

我正在与“jq”解析器作斗争,但没有想法。我只需要从给定的 json 文件中提取所需的行。

这是我的文件:

{
  "SystemInventory": {
    "BIOS": [
      {
        "BIOSReleaseDate": "11/12/2020",
        "FQDD": "BIOS.Setup.1-1",
        "SMBIOSPresent": "True",
        "VersionString": "2.10.0"
      }
    ],
    "CPU": [
      {
        "CPUFamily": "Intel(R) Xeon(TM)",
        "Characteristics": "64-bit capable",
        "CurrentClockSpeed": "2.2 GHz",
        "DeviceDescription": "CPU 1"
      },
      {
        "CPUFamily": "Intel(R) Xeon(TM)",
        "Characteristics": "64-bit capable",
        "CurrentClockSpeed": "2.2 GHz",
        "DeviceDescription": "CPU 2"
      }
    ],
    "iDRACNIC": [
      {
        "IPv4Address": "6.6.16.16",
        "NICDuplex": "Full",
        "NICEnabled": "Enabled",
        "NICSpeed": "100",
        "PermanentMACAddress": "5c:d8:8f:1e:51:ce"
      }
    ]
  }
}

比方说,我只需要几行,我希望输出是这样的:

"BIOSReleaseDate": "11/12/2020"
"VersionString": "2.10.0"
"CPUFamily": "Intel(R) Xeon(TM)"
"DeviceDescription": "CPU 1"
"DeviceDescription": "CPU 2"
"IPv4Address": "6.6.16.16"
"NICSpeed": "100"

我用“jq”解析器尝试过,但是当涉及到嵌套对象时,我没有想法。 有没有办法通过 jq 实现这一点?

我将不胜感激任何形式的帮助..

在此先感谢

以下如何根据您的输入解析特定行的方法对我来说似乎更方便:

cat data.json | jq '.SystemInventory.BIOS[0] | {BIOS: .VersionString}'
{
  "BIOS": "2.10.0"
}

cat data.json | jq '.SystemInventory.iDRACNIC[0] | {IP: .IPv4Address}'
{
  "IP": "6.6.16.16"
}

有没有办法在一个命令中实现这一点? 提前致谢!

【问题讨论】:

  • 我建议显示您用于更简单情况的代码。
  • jq '.SystemInventory.BIOS[0].BIOSReleaseDate'等有什么问题?
  • 在没有需求描述和某种代码或伪代码的情况下,很难从单个输入示例和预期输出中辨别需求!

标签: json linux parsing jq


【解决方案1】:

对于您的示例,以下调用会根据我认为的要求生成如下所示的输出,尽管输出与问题中显示的内容略有不同:

jq -r -f program.jq myfile.json

program.jq 包含的位置:

.SystemInventory[][]
| {BIOSReleaseDate, VersionString, CPUFamily, DeviceDescription, IPv4Address, NICSpeed}
| to_entries[]
| select(.value != null)
| "\"\(.key)\": \"\(.value)\""

输出

"BIOSReleaseDate": "11/12/2020"
"VersionString": "2.10.0"
"CPUFamily": "Intel(R) Xeon(TM)"
"DeviceDescription": "CPU 1"
"CPUFamily": "Intel(R) Xeon(TM)"
"DeviceDescription": "CPU 2"
"IPv4Address": "6.6.16.16"
"NICSpeed": "100"

【讨论】:

  • 非常感谢,这正是我需要实现的目标!
【解决方案2】:

jq '.SystemInventory.BIOS[0].BIOSReleaseDate' 似乎很好,但我只会得到一行,以及如何与其他行结合,例如jq '.SystemInventory.iDRACNIC[0].IPv4Address' 所以我会得到两行作为输出?? 谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多