首页 > 解决方案 > 如何以表格格式打印嵌套的 JSON 数组数据?

问题描述

我想读取其中的集群和服务器的状态。

下面是示例 json 文件

"data": [{
        "id": 7865,
        "timeCreated": 1602589399294,
        "timeUpdated": 1602748892149,
        "name": "gw-ext-1",
        "type": "CLUSTER",
        "status": "RUNNING",
        "multicastEnabled": false,
        "primaryNodeId": 546,
        "servers": [{
            "id": 768,
            "timeCreated": 1602589028419,
            "timeUpdated": 1602747941321,
            "name": "gw-jpg208765-1",
            "type": "SERVER",
            "serverType": "GATEWAY",
            "status": "RUNNING",
            "addresses": [{
                "networkInterface": "eng123"
            },
            {
                "networkInterface": "eng124"
            }],
            "clusterId": 098,
            "clusterName": "gw-ext-1",
            "currentClusteringPort": 897,
            "runtimeInformation": {
                "Information": {
                    "runtime": {
                        "name": "abctech",
                        "version": "1.6.8"
                    },
                    "specification": {
                        "vendor": "rrr",
                        "name": "rrrt",
                        "version": "1.8.89"
                    }
                },
                "osInformation": {
                    "name": "LX",
                    "version": "35",
                    "architecture": "klh"
                },
                "mExpirationDate": 098765589283662
            }
        },
        {
            "id": 876,
            "timeCreated": 1602589007370,
            "timeUpdated": 1602748894901,
            "name": "gw-jpg208765-2",
            "type": "SERVER",
            "serverType": "GATEWAY",
            "mVersion": "3.9.1",
            "gaVersion": "3.9.1",
            "agentVersion": "1.9.5",
            "ExpirationDate": 32521996800000,
            "ExpirationDate": 1665661007000,
            "status": "DISCONNECTED",
            "addresses": [{
                "networkInterface": "engg"
            },
            {
                "networkInterface": "engg"
            }],
            "clusterId": 768,
            "clusterName": "gw-ext-1",
            "serverPort": 987,
            "currentClusteringPort": 987,
            "runtimeInformation": {
                "abcInfo": {
                    "runtime": {
                        "name": "abc",
                        "version": "1.2.3"
                    },
                    "specification": {
                        "vendor": "RRR",
                        "name": "RTR",
                        "version": "1.8.0"
                    }
                },
                "osInformation": {
                    "name": "LX",
                    "version": "4.78",
                    "architecture": "eng"
                },
                "ExpirationDate": 8765478999765
            }
        }],
        "visibilityMap": {
            "mapNodes": [{
                "serverId": 765,
                "visibleNodeIds": [765,
                876],
                "unknownNodeIps": []
            },
            {
                "serverId": 876,
                "visibleNodeIds": [765,
                876],
                "unknownNodeIps": []
            }]
        }
    },
    {
        "id": 7865,
        "timeCreated": 1602589399294,
        "timeUpdated": 1602748892149,
        "name": "gw-ext-2",
        "type": "CLUSTER",
        "status": "RUNNING",
        "multicastEnabled": false,
        "primaryNodeId": 546,
        "servers": [{
            "id": 768,
            "timeCreated": 1602589028419,
            "timeUpdated": 1602747941321,
            "name": "gw-jpg208766-1",
            "type": "SERVER",
            "serverType": "GATEWAY",
            "status": "RUNNING",
            "addresses": [{
                "networkInterface": "eng123"
            },
            {
                "networkInterface": "eng124"
            }],
            "clusterId": 098,
            "clusterName": "gw-ext-2",
            "currentClusteringPort": 897,
            "runtimeInformation": {
                "Information": {
                    "runtime": {
                        "name": "abctech",
                        "version": "1.6.8"
                    },
                    "specification": {
                        "vendor": "rrr",
                        "name": "rrrt",
                        "version": "1.8.89"
                    }
                },
                "osInformation": {
                    "name": "LX",
                    "version": "35",
                    "architecture": "klh"
                },
                "mExpirationDate": 098765589283662
            }
        },
        {
            "id": 876,
            "timeCreated": 1602589007370,
            "timeUpdated": 1602748894901,
            "name": "gw-jpg208766-2",
            "type": "SERVER",
            "serverType": "GATEWAY",
            "mVersion": "3.9.1",
            "gaVersion": "3.9.1",
            "agentVersion": "1.9.5",
            "ExpirationDate": 32521996800000,
            "ExpirationDate": 1665661007000,
            "status": "DISCONNECTED",
            "addresses": [{
                "networkInterface": "engg"
            },
            {
                "networkInterface": "engg"
            }],
            "clusterId": 768,
            "clusterName": "gw-ext-2",
            "serverPort": 987,
            "currentClusteringPort": 987,
            "runtimeInformation": {
                "abcInfo": {
                    "runtime": {
                        "name": "abc",
                        "version": "1.2.3"
                    },
                    "specification": {
                        "vendor": "RRR",
                        "name": "RTR",
                        "version": "1.8.0"
                    }
                },
                "osInformation": {
                    "name": "LX",
                    "version": "4.78",
                    "architecture": "eng"
                },
                "ExpirationDate": 8765478999765
            }
        }],
        "visibilityMap": {
            "mapNodes": [{
                "serverId": 765,
                "visibleNodeIds": [765,
                876],
                "unknownNodeIps": []
            },
            {
                "serverId": 876,
                "visibleNodeIds": [765,
                876],
                "unknownNodeIps": []
            }]
        }
    }]

所以在每个集群中我们有两台服务器,这个 json 继续有大约 15 个集群。我想以以下格式过滤掉每个集群和服务器的状态

name            cluster/server status
gw-ext-1        CLUSTER        RUNNING
gw-jpg208765-1  SERVER         RUNNING
gw-jpg208765-2  SERVER         DISCONNECTED

其他集群也类似。

我尝试了几件事,但它没有给我服务器..它只提供集群的详细信息

target_id=echo \$targetIdResponse | ${env.WORKSPACE}/jq -r '.data[] | [.name, .type, .status]'

target_id=echo \$targetIdResponse | ${env.WORKSPACE}/jq -r '.data[] | [.name, .type, .status, .servers.name, .servers.type, .servers.status]'

其中 $targetIdResponse 包含我的 json 数据

我想知道如何过滤上面的 json 以获得所需的数据。

标签: jsonjq

解决方案


您需要将标题数组中的必填字段放在一个单独的数组中,并使用表格格式将它们放在一起@tsv

jq -r '[ "name", "cluster/server", "status" ], 
       ( .data[] | [.name, .type, .status]  ), 
       ( .data[].servers[] | [ .name, .type, .status ] ) | @tsv'

自最初发布以来,已修改要求以使服务器信息恰好低于集群信息

jq -r '[ "name", "cluster/server", "status" ],
       ( .data[] | [.name, .type, .status], ( .servers[] | [.name, .type, .status] ) ) | @tsv'

推荐阅读