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.

관련 정보