나는 다음과 같은 개체를 가지고 있습니다
{
"name": "Papanito",
"fields": [
{
"name": "Name1",
"value": "Value1",
"type": 0,
"linkedId": null
},
{
"name": "Name2",
"value": "Value2",
"type": 0,
"linkedId": null
},
{
"name": "Name3",
"value": "Value3",
"type": 0,
"linkedId": null
},
{
"name": "Name4",
"value": "Value3",
"type": 0,
"linkedId": null
}
],
}
여기서 전환하고 싶어요
{
"name": "Papanito",
"fields": [
"Name1": "Value1",
"Name2": "Value2",
"Name3": "Value3",
"Name4": "Value4",
],
}
몇 가지를 시도했지만 아직 무엇을 해야할지 모르겠습니다.
답변1
jq '.fields |= ( map(.key = .name | del(.type,.linkedId,.name)) | from_entries )' file
그러면 fields
배열이 업데이트됩니다. 먼저 각 요소에 대해( 사용 ) map()
key key
의 값을 사용하여 키를 만듭니다 name
. 그런 다음 요소에서 type
및 키를 제거합니다 linkedId
. 이제 배열의 각 요소에 name
a와 키가 남습니다 key
. 이는 정확히 값이 키 값과 연결되어야 하는 위치입니다.value
fields
from_entries
key
value
질문에 제공된 데이터를 테스트하면(후행 쉼표 제거) 다음 JSON이 생성됩니다.
{
"name": "Papanito",
"fields": {
"Name1": "Value1",
"Name2": "Value2",
"Name3": "Value3",
"Name4": "Value3"
}
}
배열에는 키가 있을 수 없으므로 예상되는 출력은 잘못된 JSON입니다. 따라서 fields
위 출력의 값은 배열이 아니라 개체입니다.
fields
배열로 유지하려면 작업을 약간 재정렬하면 됩니다.
jq '.fields |= map([.key = .name | del(.type,.linkedId,.name)] | from_entries)' file
주어진 데이터(위와 같이 수정됨)에 대해 다음 문서와 동등한 문서가 생성됩니다.
{
"name": "Papanito",
"fields": [
{ "Name1": "Value1" },
{ "Name2": "Value2" },
{ "Name3": "Value3" },
{ "Name4": "Value3" }
]
}
이것의 장점은 name
원래 값이 동일한 두 요소가 결과에서 서로 덮어쓰이지 않는다는 것입니다.
개념적으로는 위의삭제더 이상 필요하지 않은 데이터. 아래 변형정제우리가 원하는 데이터.
그러면 위의 최종 결과가 생성됩니다.
jq '.fields |= map({ (.name): .value })' file
fields
목록의 항목을 병합하여 첫 번째 결과(단일 개체)를 얻을 수 있습니다 .
jq '.fields |= (map({ (.name): .value }) | add)' file