JSON:使用jq编辑嵌套数组中的特定值

时间:2016-08-16 18:07:13

标签: arrays json jq

我尝试使用实用程序jq更新数组内的数组中的值。我已经粘贴了下面的示例json。

更具体地说:在工作表数组中,然后在公式数组中,我想更改每个columnName的值为" MONTH"到了#34;年"。我想在sheetSleles数组中的sheet数组中做同样的事情,改变" MONTH"也是"年"

这个jq过滤器获取了columnNames的列表。

.sheets[1] | .formulas[] | .columnName

如何通过更新我想要的值来编辑整个文件?我是否使用if?

如果我想编辑一部分值,该怎么办?例如,在forumlaString属性中,只更改包含MONTH的字符串部分,但保留其余部分?

{
  "version": "6.1.1",
  "className": "xyz",
  "sheets": [    
  {
      "name": "Pass1",
      "sheetId": "95e6c2cd-abbe-46c1-8012-bdf37438b9b7",
      "keep": true,
      "formulas": [
        {
          "columnName": "SAMPLE_PROVIDER",
          "columnId": "0",
          "columnIndex": 0,
          "formulaString": "\u003dGROUPBY(#Raw!SAMPLE_PROVIDER)"
        },
        {
          "columnName": "MONTH",
          "columnId": "1",
          "columnIndex": 1,
          "formulaString": "\u003dGROUPBY(#Raw!MONTH)"
        }
      ],
      "columnStyles": [
        {
          "columnId": "0",
          "name": "SAMPLE_PROVIDER",
          "width": 206,
          "thousandSeparator": true
        },
        {
          "columnId": "1",
          "name": "MONTH",
          "width": 100,
          "thousandSeparator": true
        }
        ],
      "nextColumnId": 2
    },
    {
      "name": "Transform1",
      "sheetId": "49071c1c-fa84-4ae3-92c1-b63175a6b26c",
      "keep": true,
      "formulas": [
        {
          "columnName": "SAMPLE_PROVIDER",
          "columnId": "0",
          "columnIndex": 0,
          "formulaString": "\u003d#Pass1!SAMPLE_PROVIDER"
        },
        {
          "columnName": "MONTH",
          "columnId": "1",
          "columnIndex": 1,
          "formulaString": "\u003d#Pass1!MONTH"
        }
      ],
      "columnStyles": [
        {
          "columnId": "0",
          "name": "SAMPLE_PROVIDER",
          "width": 179,
          "thousandSeparator": true
        },
        {
          "columnId": "1",
          "name": "MONTH",
          "width": 100,
          "thousandSeparator": true
        }
      ],
      "nextColumnId": 3
    }
  ],
  "advancedSchedulingInUse": true,
  "errorHandlingMode": "IGNORE"
}

3 个答案:

答案 0 :(得分:2)

看起来您更新的不仅仅是公式数组中的字段,还包括一些内容。

如果您想不加区别地将字符串"MONTH"的所有匹配项更改为"YEAR",您可以这样做:

(.. | strings) |= sub("MONTH"; "YEAR")

答案 1 :(得分:1)

要更改所需容器中的columnName字段,您可以使用

jq '(.sheets[] | .formulas[]? | .columnName | select(.=="MONTH")) |= "YEAR"' tmp.json

(如果没有密钥?formula可以避免错误。)

要在公式字符串中将MONTH替换为YEAR,请将每个formulaString值替换为sub返回的可能修改后的字符串。

jq '(.sheets[] | .formulas[]? | .formulaString) |= sub("MONTH"; "YEAR")' tmp.json

sub需要jq 1.5,使用Oniguruma库进行编译。)

将这些组合成一个jq过滤器?我不肯定;我对其中任何一个单独行动的原因只有一种微妙的理解。

答案 2 :(得分:0)

这可能是步行/ 1的任务。

(如果您的jq没有walk / 1,那么您可以从https://github.com/stedolan/jq/blob/master/src/builtin.jq复制其定义

例如,如果要在“MONTH”作为对象中某个键的值出现时将“MONTH”更改为“YEAR”,则以下内容将完成此任务:

jq 'walk(if type == "object" then with_entries(.value |= (if . == "MONTH" then "YEAR" else . end)) else . end)' input.json

等价: jq 'walk(if type == "object" then with_entries(if .value == "MONTH" then .value = "YEAR" else . end) else . end)' input.json

这些可以根据类似要求轻松修改。