jq 배열에 있는 객체의 특정 값만 사용하여 목록을 선택하여 배열을 변환합니다.

jq 배열에 있는 객체의 특정 값만 사용하여 목록을 선택하여 배열을 변환합니다.

나는 다음과 같은 개체를 가지고 있습니다

{
  "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. 이제 배열의 각 요소에 namea와 키가 남습니다 key. 이는 정확히 값이 키 값과 연결되어야 하는 위치입니다.valuefieldsfrom_entrieskeyvalue

질문에 제공된 데이터를 테스트하면(후행 쉼표 제거) 다음 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

관련 정보