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
.