2016-09-04 7 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、しかし、私は正しい表現を構築するための手がかりがないように見えます。

条件は、型チェックに基づいて、それが正しい方法のように見えますが、ちょうど-timeエラーを「コンパイル」を返す、私はそれを修正する方法がわからない:

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

条件"$value"チェックに基づいて、私が理解したようならば、ここでの内部で、問題を

.[] | { name, expire: (if .expire then (if .expire."$value"? then .expire."$value" else .expire end) else null end) } 

第2の目的は、.expire."$value"?でチェックところ、エラーはエラーのため結果からスローされたオブジェクトが削除されました。何とか第2の目的を除外する。

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) }) 

または(エッジケースで有意に異なる意味を持つ):

関連する問題