
JSONファイルに関する問題を解決できるスクリプトを探しています。問題は、APIが私に次のファイルを渡すことです。
{
"device 1":{
"general_data":{
"descriptions":[
"description1",
"description2",
"description3",
"description4",
"description5",
"description6",
"description7",
"description8"
],
"values":[
"value1",
"value2",
"value3",
"value4",
"value5",
"value6",
"value7",
"value8"
]
},
"alarms":{
"descriptions":[
"description1",
"description2",
"description3",
"description4",
"description5",
"description6",
"description7",
"description8",
"description9"
],
"values":[
"value1",
"value2",
"value3",
"value4",
"value5",
"value6",
"value7",
"value8",
"value9"
]
},
"communications":{
"descriptions":[
"description1",
"description2"
],
"values":[
"value1",
"value2"
]
},
"status":{
"descriptions":[
"description1",
"description2",
"description3",
"description4",
"description5",
"description6",
"description7",
"description8",
"description9",
"description10",
"description11",
"description12"
],
"values":[
"value1",
"value2",
"value3",
"value4",
"value5",
"value6",
"value7",
"value8",
"value9",
"value10",
"value11",
"value12"
]
},
"measures":{
"descriptions":[
"description1"
],
"values":[
"value1"
]
},
"analogic_measures":{
"descriptions":[
"description1"
],
"values":[
"value1"
]
},
"lat_lon":{
"descriptions":[
"description1",
"description2"
],
"values":[
"value1",
"value1"
]
}
},
...
}
ファイル内の各デバイスが次のようになるように変更する必要があります。
{
"device 1":{
"general_data":[
{"description":"description1","value":"value1"},
{"description":"description2","value":"value2"},
{"description":"description3","value":"value3"},
{"description":"description4","value":"value4"},
{"description":"description5","value":"value5"},
{"description":"description6","value":"value6"},
{"description":"description7","value":"value7"},
{"description":"description8","value":"value8"}
],
"alarms":[
{"description":"description1","value":"value1"},
{"description":"description2","value":"value2"},
{"description":"description3","value":"value3"},
{"description":"description4","value":"value4"},
{"description":"description5","value":"value5"},
{"description":"description6","value":"value6"},
{"description":"description7","value":"value7"},
{"description":"description8","value":"value8"},
{"description":"description9","value":"value9"}
],
"communications":[
{"description":"description1","value":"value1"},
{"description":"description2","value":"value2"}
],
"status":[
{"description":"description1","value":"value1"},
{"description":"description2","value":"value2"},
{"description":"description3","value":"value3"},
{"description":"description4","value":"value4"},
{"description":"description5","value":"value5"},
{"description":"description6","value":"value6"},
{"description":"description7","value":"value7"},
{"description":"description8","value":"value8"},
{"description":"description9","value":"value9"},
{"description":"description10","value":"value10"},
{"description":"description11","value":"value11"},
{"description":"description12","value":"value12"}
],
"measures":[
{"description":"description1","value":"value1"}
],
"analogic_measures":[
{"description":"description1","value":"value1"}
],
"lat_lon":[
{"description":"description1","value":"value1"},
{"description":"description2","value":"value2"}
]
},
...
}
答え1
努力する
jq 'with_entries(.value|=with_entries(.value|=([.descriptions, .values] | transpose | map({description:.[0], value:.[1]}))))' < yourfile.json
最初は、with_entries
すべてのデバイスキーを変更する値を使用してすべてのデバイスキーを繰り返します.value|=...
。これにより、各デバイスのデータフィールドも同じです。最後に、説明と値のリストを取得し、各値が説明とペアになるように転置し、抽出してdescription
フィールドを使用してvalue
オブジェクトを作成します。
シェルスクリプトなどに挿入できます。
答え2
JSON文書の形式が正しく、各descriptions
項目values
に最上位キーの下の各子オブジェクトにdevice 1
対応する項目があるとします(その逆も同様)。
jq '."device 1"[] |=
[
range(.values|length) as $i |
{ description: .descriptions[$i], value: .values[$i] }
]' file.json
これらの配列のインデックスを繰り返し、各ペアに対して新しいオブジェクトを作成してdescriptions
値と値をペアにします。values
これらの新しいオブジェクトは配列に配置され、現在の子オブジェクトの古い構造を置き換えますdevice 1
。