チェックにより、配列の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

同様の考えもう一つの答えnameただし、キー値をキーに変換せずに元のJSONドキュメントで機能します。

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

これはname、値が文字列ではない最上位配列のすべての項目を抽出しますnull。次に、残りの項目から合計値を抽出しますnametype

一般的に言えば、使用することはほとんど意味がありません。データJSONのキー値として元のファイルを使用することにしました。

関連情報