使用jq根据键和类型对JSON值进行条件转换

时间:2019-10-15 22:13:19

标签: json bash jq

我有一个json文件,我想将一些命名键的值从数字(0 / 1)转换为布尔值(0 => {{1} },false => 1)中使用true

该转换应该是可重入的。如果我在(部分)转换的文件上运行它,那么已经转换的键应该保持不变。

给出此json文件:

jq

和以下键列表:

  • .foo.bar.visible
  • .foo.baz.tasty
  • .fubar.enabled
  • .fubar.sub.empty
  • 。正在运行

我希望jq将上面的内容转换成这样:

{
  "foo": {
    "bar": {
      "color": "green",
      "visible": 0
    },
    "baz": {
      "fruit": "banana",
      "tasty": true
    }
  },
  "fubar": {
    "string": "hi",
    "value": "world",
    "enabled": 1,
    "sub": {
      "valuable": true,
      "empty": false
    }
  },
  "running": 1
}

我想出了这一点(仅使用前两个键使其简短):

{
  "foo": {
    "bar": {
      "color": "green",
      "visible": false
    },
    "baz": {
      "fruit": "banana",
      "tasty": true
    }
  },
  "fubar": {
    "string": "hi",
    "value": "world",
    "enabled": true,
    "sub": {
      "valuable": true,
      "empty": false
    }
  },
  "running": true
}

但是必须有更好的方法吗?

也尝试将其放入cat in.json | jq '.foo.bar.visible = (if .foo.bar.visible | type == "boolean" then .foo.bar.visible elif .foo.bar.visible == 1 then true else false end) | .foo.baz.tasty = (if .foo.baz.tasty | type == "boolean" then .foo.baz.tasty elif .foo.baz.tasty == 1 then true else false end)' > out.json 中,但这没用:

def

1 个答案:

答案 0 :(得分:2)

def numerictobool:
  if type == "boolean" then . else . == 1 end;

.
| .foo.bar.visible |= numerictobool
| .foo.baz.tasty |= numerictobool
| .fubar.enabled |= numerictobool
| .fubar.sub.empty |= numerictobool
| .running |= numerictobool

...根据您的输入显示为输出:

{
  "foo": {
    "bar": {
      "color": "green",
      "visible": false
    },
    "baz": {
      "fruit": "banana",
      "tasty": true
    }
  },
  "fubar": {
    "string": "hi",
    "value": "world",
    "enabled": true,
    "sub": {
      "valuable": true,
      "empty": false
    }
  },
  "running": true
}
相关问题