通过检查从数组中的 json 获取键和值

通过检查从数组中的 json 获取键和值

我有一个 json

[
    {
        "name": "type1",
        "type": "string",
        "values": {
            "set1": "dataA1",
            "set1": "dataA2"
        }
    },
    {
        "name": "type2",
        "type": "string",
        "values": {
            "set1": "dataB1",
            "set2": "dataB2"
        }
    },
    {
        "name": "null",
        "type": "string",
        "values": {
            "set1": "dataC1",
            "set2": "dataC2"
        }
    },
    {
        "name": "type4",
        "type": "string",
        "values": {
            "set1": "dataD1",
            "set2": "dataD2"
        }
    }
]

这是一个很长的 json,所以我想把它做成这样。

{
    "type1": {
        "type": "string",
        "values": {
            "set1": "dataA1",
            "set2": "dataA2"
        }
    },
    null: {
        "type": "string",
        "values": {
            "set1": "dataB1",
            "set2": "dataB2"
        }
    },
    "type3": {
        "type": "string",
        "values": {
            "set1": "dataC1",
            "set2": "dataC2"
        }
    },
    "type4": {
        "type": "string",
        "values": {
            "set1": "dataD1",
            "set2": "dataD2"
        }
    }
}

所以我想问一下这个到底好不好还是应该用旧的。如果这个更好的话我以前用过jq '.[] | .name, .type' file.json

然后如何使用新的 json 获取这样的输出

"key"
"type"
"key"
"type"
"key"
"type"

所以输出变成

type1
string
type2
string
# the type3 and its type is not needed cause its null
type4
string

另外,某些值名称为空,所以我不希望字符串也为空。

答案1

您可以使用to_entries,然后选择非空键并提取值:

jq 'to_entries | map(select(.key != "null"))[] | (.key, .value.type)' < file2.json

答案2

类似的想法另一个答案但作用于原始 JSON 文档而不将name键的值转换为键:

$ jq -r 'map( select(.name != "null") | .name, .type )[]'  file
type1
string
type2
string
type4
string

这会提取顶级数组中name值不是 string的所有条目null。然后它从剩余条目中提取name和值。type

一般来说,使用意义不大数据作为 JSON 中键的值,这就是我选择使用原始文件的原因。

相关内容