JSONファイル構造を変更するスクリプト

JSONファイル構造を変更するスクリプト

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

関連情報