Sunday, February 27, 2022

[SOLVED] jq update boolean value in json file

Issue

I am trying to update a boolean value in a json file using jq.

My json file is like this:

{
  "kind": "KubeletConfiguration",
  "apiVersion": "kubelet.config.k8s.io/v1beta1",
  "address": "0.0.0.0",
  "authentication": {
    "anonymous": {
      "enabled": true
    },
    "webhook": {
      "cacheTTL": "2m0s",
      "enabled": true
    },
    "x509": {
      "clientCAFile": "/etc/kubernetes/pki/ca.crt"
    }
  },
  "authorization": {
    "mode": "Webhook",
    "webhook": {
      "cacheAuthorizedTTL": "5m0s",
      "cacheUnauthorizedTTL": "30s"
    }
  },
....omitted

and I want to update the .authentication.anonymous.enabled value with the boolean false

I have tried the following:

jq --arg new false '.authentication.anonymous.enabled |= $new' config.json

This updates the value to false but it does so as a string, rather than a boolean. As below:

{
  "kind": "KubeletConfiguration",
  "apiVersion": "kubelet.config.k8s.io/v1beta1",
  "address": "0.0.0.0",
  "authentication": {
    "anonymous": {
      "enabled": "false"
    },
    "webhook": {
      "cacheTTL": "2m0s",
      "enabled": true
    },
    "x509": {
      "clientCAFile": "/etc/kubernetes/pki/ca.crt"
    }
  },
  "authorization": {
    "mode": "Webhook",
    "webhook": {
      "cacheAuthorizedTTL": "5m0s",
      "cacheUnauthorizedTTL": "30s"
    }
  },
....omitted

How do I get this to update as a boolean (no quotes around the value)?


Solution

Use --argjson for JSON parameters. Also, you only need the assignment operator = here as the evaluation of the RHS doesn't rely on the LHS context.

jq --argjson new false '.authentication.anonymous.enabled = $new' config.json

Demo

If you only wanted to toggle that field, you could do it without parameters and variables:

jq '.authentication.anonymous.enabled |= not' config.json

Demo



Answered By - pmf
Answer Checked By - Dawn Plyler (WPSolving Volunteer)