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オブジェクトを作成します。

シェルスクリプトなどに挿入できます。

おすすめ記事