2016-09-04 2 views
3

와 나는 JSON의이 샘플이 있습니다수정 개체 속성 조건부 JQ

[ 
    { 
     "name": "val1", 
     "expire": { "$value": 10 } 
    }, 
    { 
     "name": "val2", 
     "expire": 20 
    }, 
    { 
     "name": "val3" 
    } 
] 

을 그리고 난 JQ와 함께이 양식으로 변환 할 :

나는 그것이 경우의 발견했습니다
[ 
    { 
     "name": "val1", 
     "expire": 10 
    }, 
    { 
     "name": "val2", 
     "expire": 20 
    }, 
    { 
     "name": "val3", 
     "expire": null 
    } 
] 

모든 -then-else,하지만 올바른 표현을 만드는 법을 알지 못하는 것 같습니다. 유형 검사에 따라

조건, 그것은 올바른 방법처럼 보이지만 단지, 내가 그것을 해결하는 방법을 모른다 - 시간 오류 반환 "컴파일"

"$value" 검사를 기반으로
.[] | { name, expire: (if .expire then (if type(.expire) == "number" then .expire else .expire."$value" end) else null end) } 

조건, 어떻게 든 두 번째 객체를 필터링 :

내가 알고있는 것처럼
.[] | { name, expire: (if .expire then (if .expire."$value"? then .expire."$value" else .expire end) else null end) } 

, 결과에서 오류로 인해 제거 된 두 번째 목적은 .expire."$value"?로 확인할 여기에서 내부 경우 문제, 오류가 발생하고 객체입니다.

map(.expire |= if type == "object" then .["$value"] 
       elif type == "number" then . else null end) 

답변

1

이 필터를 사용해보십시오 현재 값 또는 현재 값. 값이 존재하지 않으면 단순히 null입니다.

.[].expire |= (."$value"? // .) 
+0

고마워요! 그것은 작동합니다 :) –

3

당신은 다른 식으로 "$value" 경우 각 개체의 expire 속성을 업데이트로 생각할 수 있습니다

map({name, 
     "expire": (.expire | if type == "object" then .["$value"] elif type == "number" then . else null end) }) 

또는 (에지의 경우 상당히 다른 의미로) :