2017-12-27 2 views
1

를 사용하여 JSON 개체 목록에서 (알려진 키를 일치),업데이트 하나 개의 값 i가 환경 파일과 아래 형식으로 여러 JSON 파일이 및 엔드 포인트에 대해 그것을 테스트해야 JQ

{ 
    "id": "test1123", 
    "name": "my testing", 
    "values": [ 
    { 
     "enabled": true, 
     "key": "URL", 
     "value": "http://localhost:3000/", 
     "type": "text" 
    }, 
    { 
     "enabled": true, 
     "key": "User1Token", 
     "value": "", 
     "type": "text" 
    }, 
    { 
     "enabled": true, 
     "key": "User2Token", 
     "value": "", 
     "type": "text" 
    }, 
    { 
     "enabled": true, 
     "key": "IdentityURL", 
     "value": "", 
     "type": "text" 
    }, 
    { 
     "enabled": true, 
     "key": "AdminToken", 
     "value": "", 
     "type": "text" 
    } 
    ], 
    "timestamp": 1511892974802, 
    "_postman_variable_scope": "environment", 
    "_postman_exported_at": "2017-11-28T19:38:23.389Z", 
    "_postman_exported_using": "Postman/5.3.0" 
} 

나는 원 테스트를 실행하기 전에이 json에서 엔드 포인트를 업데이트하십시오. 종점 값은 키 "URL"인 값 value 속성 오브젝트

그래서 상기의 경우에, I 값 어레이의 첫번째 인덱스에 엔드 포인트를 업데이트해야 추가해야

{ 
    "enabled": true, 
    "key": "URL", 
    "value": "http://10.20.200.1/", 
    "type": "text" 
} 

어디 http://10.20.200.1/ 내 끝점입니다.

jq '.values | map(if .key == "URL" then . + {"value":"10.20.13.28/";} else . end)' 

... 그러나 이것은 구문 오류가 발생합니다

내가 사용하기 위해 노력하고있어 현재의 코드입니다. 누구나 jq를 올바르게 사용하여 값을 올바르게 업데이트하는 방법을 제안 할 수 있습니까?

참고 : 키 URL은 항상 값의 첫 번째 인덱스가 아닙니다.

+1

시도한'jq' 코드를 표시 할 수 있습니까? –

+0

jq '. 값 | map (.key == "URL"then. + { "value": "http://10.20.13.28/"} else. end) '. 이 문제는 단지 출력 객체가 전체 json을 포함하고 있기 때문입니다. 값 객체 인 – Annette

답변

1

주변의 다른 키/값 쌍을 유지하고 values 항목 만 업데이트하려면 새 값을 계산해야합니다. 그 일을하면 다음과 같이 보일 수 있습니다 :

jq \ 
    --arg updateKey "URL" \ 
    --arg updateVal "http://10.20.200.1" \ 
    '.values = [.values[] | if (.key == $updateKey) then (.value = $updateVal) else . end]' 
2

다음은 단지 CharlesDuffy의 훌륭한 대답 @의 변형입니다 :

def when(c; f): if c? // null then f else . end; 

.values = map(when(.key == $updateKey; .value = $updateVal)) 

when/2의이 정의는 매우 포괄적이다. 작은 안전 장치가 추가되어 지루함을 피할 수 있습니다. if _ then _ else . end. 아마도 표준 JQ 라이브러리 (예 : ~/.jq 또는 ~/.jq/jq/jq.jq)의 가치가 있습니다.

+0

을 고려하고 있습니다. 매우 편리합니다. 실제로 유용 할 뿐이며,'jq' 명예로운 점 파일을 알지 못했습니다. :) –

+0

@CharlesDuffy - 아아아, ~/.jq가있는 상황은 현재 약간 엉망입니다. 예 : https://github.com/stedolan/jq/issues/1501 – peak

관련 문제