2017-08-18 4 views
1

J'ai un document JSON qui ressemble à ceci. Notez que c'est un exemple simplifié du réel JSON, qui est inclus dans le fond de la question:Comment mettre à jour une seule valeur dans un tableau imbriqué d'objets dans un document json en utilisant jq?

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

Je voudrais changer la valeur de toutes les k2 clés du tableau some_array où la valeur de la clé k1 est "B".

Est-ce possible en utilisant jq?

Pour référence, il s'agit du document JSON réel, qui est un fichier de variable d'environnement à utiliser dans l'outil postman/newman. Je tente cette conversion à l'aide JQ car l'outil ne supporte pas encore command line overrides of specific environment variables

JSON Actual

{ 
    "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" 
} 

Répondre

3

Voici une version légèrement plus simple du filtre de zayquan:

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

Voici une solution viable:

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

produit la sortie:

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

Voici une autre solution.

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

Sortie

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