2017-08-18 5 views
1

次のようなJSONドキュメントがあります。なお、この質問の下部に含まれている実際のJSONの簡単な例である:私は​​キーの値はsome_arrayアレイ内のすべてのk2のキーの値を変更したいjqを使用してjsonドキュメント内のオブジェクトのネストされた配列内の単一の値を更新するにはどうすればよいですか?

{ 
    "some_array": [ 
    { 
     "k1": "A", 
     "k2": "XXX" 
    }, 
    { 
     "k1": "B", 
     "k2": "YYY" 
    } 
    ] 
} 

"B"。

これはjqを使用して可能ですか?

これは実際のJSONドキュメントです。postman/newmanツールで使用する環境変数ファイルです。私は、ツールがまだcommand line overrides of specific environment variables

実際のJSONをサポートしていないので、JQを使用して、この変換を試みる。ここ

{ 
    "name": "Local-Stack-Env-Config", 
    "values": [ 
    { 
     "enabled": true, 
     "key": "KC_master_host", 
     "type": "text", 
     "value": "http://localhost:8087" 
    }, 
    { 
     "enabled": true, 
     "key": "KC_user_guid", 
     "type": "text", 
     "value": "11111111-1111-1111-1111-11111111111" 
    } 
    ], 
    "timestamp": 1502768145037, 
    "_postman_variable_scope": "environment", 
    "_postman_exported_at": "2017-08-15T03:36:41.474Z", 
    "_postman_exported_using": "Postman/5.1.3" 
} 

答えて

3
ここ

zayquanのフィルタの少し簡単なバージョンです:

.some_array |= map(if .k1=="B" then .k2="changed" else . end) 
2

が実行可能なソリューションでいます:

cat some.json | jq '.some_array = (.some_array | map(if .k1 == "B" then . + {"k2":"changed"} else . end))' 

は出力を生成します。

"some_array": [ 
    { 
     "k1": "A", 
     "k2": "XXX" 
    }, 
    { 
     "k1": "B", 
     "k2": "changed" 
    } 
    ] 
} 
3

別の解決方法があります。

jq '(.some_array[] | select(.k1 == "B") | .k2) |= "new_value"' 

出力

{ 
    "some_array": [ 
    { 
     "k1": "A", 
     "k2": "XXX" 
    }, 
    { 
     "k1": "B", 
     "k2": "new_value" 
    } 
    ] 
} 
関連する問題