私は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
。次に、残りの項目から合計値を抽出しますname
。type
一般的に言えば、使用することはほとんど意味がありません。データJSONのキー値として元のファイルを使用することにしました。