如何使用jq解析json数据?

如何使用jq解析json数据?

我需要从通过 API 获取的 json 中获取以下对象。我正在尝试使用 ubuntu 16.04 上提供的 jq。我正在尝试获取这种格式的数据device_name C:| free 18707755008.0 total_size 55832473600.0

有什么建议我应该如何处理这个问题吗?目标是在Excel中获得3个以上的对象。

{
    "logical": {
        "D:|": {
            "device_name": [
                "D:\\"
            ],
            "used_percent": [
                52.6,
                "%"
            ],
            "fstype": "NTFS",
            "free": [
                10178084864.0,
                "B"
            ],
            "total_size": [
                21471686656.0,
                "B"
            ],
            "used": [
                11293601792.0,
                "B"
            ],
            "opts": "rw,fixed"
        },
        "C:|": {
            "device_name": [
                "C:\\"
            ],
            "used_percent": [
                66.5,
                "%"
            ],
            "fstype": "NTFS",
            "free": [
                18707755008.0,
                "B"
            ],
            "total_size": [
                55832473600.0,
                "B"
            ],
            "used": [
                37124718592.0,
                "B"
            ],
            "opts": "rw,fixed"
        }
    }
}

答案1

以下输出 2 行,其中最后一行的字符串格式可以轻松更改:

jq -M -r '.[] | keys[] as $var |
 [.[$var].free[0], .[$var].total_size[0]] as [$f,$t] |
 "device_name \($var) free \($f) total_size \($t)" '

输出:

device_name C:| free 18707755008 total_size 55832473600
device_name D:| free 10178084864 total_size 21471686656

答案2

用这个 :

jq '.logical["D:|"].free[0], .logical["D:|"].total_size[0]' file.json

输出:

10178084864
21471686656

答案3

假设您希望从device_name下面的键值中获取设备名称logical,而不是直接从下面的键中获取设备名称logical(这样会更容易,并且还为您提供一个在 Windows 系统上是有效设备名称的值),并且您还想要我认为的这测量单位附加到实际数字(如果数据中可能有可变单位,则有意义):

jq -r '
    ["Device name", "Free space", "Total size"],
    (
        .logical[] |
        [
            .device_name[0],
            (.free       | map(tostring) | add),
            (.total_size | map(tostring) | add)
        ]
    ) | @csv' file.json

鉴于问题中的数据file.json,这将生成以下 CSV 文档(导入到 Excel 中很简单):

"Device name","Free space","Total size"
"D:\","10178084864B","21471686656B"
"C:\","18707755008B","55832473600B"

如果您希望号码和单位之间有空格,请将两个呼叫中的每一个更改为addinto 。join(" ")

相关内容