jq - 파일의 객체를 json 배열에 추가

jq - 파일의 객체를 json 배열에 추가

jq를 사용하여 기존 json 파일에 요소와 값이 포함된 배열을 추가하고 싶습니다.

이미 파일(input.json)이 있습니다.

{
  "id": 9,
  "version": 0,
  "lastUpdTs": 1532371267968,
  "name": "Training"
}

이 json(orig.json)의 다른 그룹 배열에 추가하고 싶습니다.

[
  {
    "name": "JAYS",
    "sourceConnection": {
      "name": "ORACLE_connection",
      "connectionType": "JDBC",
      "commProtocol": "JDBC"
    },
    "checked": true,
    "newlyAdded": false,
    "id": null,
    "groups": [],
    "displayName": "SCOTT",
    "defaultLevel": "MANAGED"
  }
]

최종 결과는 다음과 같아야합니다

[
  {
    "name": "JAYS",
    "sourceConnection": {
      "name": "ORACLE_connection",
      "connectionType": "JDBC",
      "commProtocol": "JDBC"
    },
    "checked": true,
    "newlyAdded": false,
    "id": null,
    "groups": [
      {
        "id": 9,
        "version": 0,
        "lastUpdTs": 1532371267968,
        "name": "Training"
      }
    ],
    "displayName": "SCOTT",
    "defaultLevel": "MANAGED"
  }
]

배열에 요소를 추가하는 방법을 알고 있지만 파일에서 요소를 전달하는 방법은 잘 모르겠습니다.

jq '.[].groups += [{"INPUT": "HERE"}]' ./orig.json

답변1

jq--argjson해당 플래그를 사용하여 실제 JSON 콘텐츠를 제공하기 위한 플래그가 있습니다 . 당신이 해야 할 일은 첫 번째 JSON 파일의 내용을 jq컨텍스트의 변수에 저장하고 두 번째 JSON에서 업데이트하는 것입니다.

jq --argjson groupInfo "$(<input.json)" '.[].groups += [$groupInfo]' orig.json

이 부분은 "$(<input.json)"주어진 파일의 내용을 출력하고 --argjson해당 인수를 변수에 저장하는 쉘 리디렉션 구성입니다 groupInfo. 이제 groups실제 필터 섹션의 배열 에 추가합니다 .

즉, 위의 솔루션은 다음을 수행하는 것과 동일합니다.

jq --argjson groupInfo '{"id": 9,"version": 0,"lastUpdTs": 1532371267968,"name": "Training" }' \
   '.[].groups += [$groupInfo]' orig.json

답변2

이게 정확한 상황이에요input기능사용:

inputinput[...]은 jq 자체와 동일한 소스(예: 명령줄에 이름이 지정된 파일인 stdin)에서 읽습니다. 이 두 가지 내장 함수와 jq 자체 읽기 작업은 인터리브될 수 있습니다.

즉, jq파일에서 객체/값을 읽고 이에 대해 파이프를 수행합니다 input.다음입력을 읽어서 함수의 결과로 사용합니다.

이는 다음을 수행할 수 있음을 의미합니다.

jq '.[].groups += [input]' orig.json input.json

이미 작성한 명령과 정확히 동일한 명령에 input값을 더한 것입니다. 표현식 input은 인수 목록의 다음 파일에서 읽은 (첫 번째) 객체로 평가됩니다(이 경우 ) input.json.

당신이 가지고 있다면많은 종류의inputs대신 동일한 의미로 삽입할 항목을 사용할 수 있습니다 . 이는 명령줄에서 단일 또는 여러 파일에 동일하게 적용되며 [inputs]모든 파일 본문을 배열로 나타냅니다.

여러 파일을 인터리브하여 각 파일에 동반 파일을 삽입하는 것도 가능 orig하지만 출력을 분할하는 것은 번거롭습니다.

답변3

새 버전 jq지원slurpfile

이렇게 하면 원하는 결과를 얻을 수 있습니다.jq '.[].groups += $inputs' orig.json --slurpfile inputs input.json

jq 1.6에서 테스트되었습니다.

답변4

점을 자리 표시자로 사용

echo '{
  "id": 9,
  "version": 0,
  "lastUpdTs": 1532371267968,
  "name": "Training"
}' | jq '[
  {
    "name": "JAYS",
    "sourceConnection": {
      "name": "ORACLE_connection",
      "connectionType": "JDBC",
      "commProtocol": "JDBC"
    },
    "checked": true,
    "newlyAdded": false,
    "id": null,
    "groups": [.],
    "displayName": "SCOTT",
    "defaultLevel": "MANAGED"
  }
]'

산출:

[
  {
    "name": "JAYS",
    "sourceConnection": {
      "name": "ORACLE_connection",
      "connectionType": "JDBC",
      "commProtocol": "JDBC"
    },
    "checked": true,
    "newlyAdded": false,
    "id": null,
    "groups": [
      {
        "id": 9,
        "version": 0,
        "lastUpdTs": 1532371267968,
        "name": "Training"
      }
    ],
    "displayName": "SCOTT",
    "defaultLevel": "MANAGED"
  }
]
jq --version
jq-1.6

관련 정보