【问题标题】:Replace values inside list替换列表中的值
【发布时间】:2021-10-25 15:17:40
【问题描述】:

我有以下对象:

{
    "db_credentials": {
        "database": "greengrass",
        "host": "localhost",
        "password": "yZqXJzXHLUsLlPm",
        "port": 7086,
        "username": "greengrass"
    },
    "default_interval": 90000,
    "fields_selected": [
        {
            "measurement": "ABPLCGD-GD_AB1AirFlowCalc",
            "aggregation": "last",
            "step": "10m",
            "timeserie_physical": "null",
            "timeserie_type": "null",
            "timeserie_interpolation": "null",
            "timeserie_unit": "null",
            "timeserie_step": "10"
        },
        {
            "measurement": "ABPLCGD-GD_AB1InletAirTempAct",
            "aggregation": "last",
            "step": "10m",
            "timeserie_physical": "null",
            "timeserie_type": "null",
            "timeserie_interpolation": "null",
            "timeserie_unit": "null",
            "timeserie_step": "10"
        }
    ]
}


我想把它变成:

{
  "db_credentials": {
    "database": "greengrass",
    "host": "localhost",
    "password": "yZqXJzXHLUsLlPm",
    "port": 7086,
    "username": "greengrass"
  },
  "default_interval": 90000,
  "fields_selected": [
      {
        "name": "ABPLCGD-GD_AB1AirFlowCalc",
        "aggregation": {
          "step": "10m",
          "function": "last"
        }
      },
      {
        "name": "ABPLCGD-GD_AB1InletAirTempAct",
        "aggregation": {
          "step": "10m",
          "function": "last"
        }
      }
    ]
}

我尝试了多种解决方案,但这是我能得到的最大值:

 jq  ' .fields_selected = .fields_selected | map({name : .measurement , aggregation : {step: .step , function: .aggregation}})' config-it-client.json

但我总是遇到这个错误 无法用字符串“测量”索引数字,我无法弄清楚我做错了什么

【问题讨论】:

    标签: jq


    【解决方案1】:

    我会使用以下内容:

    .fields_selected[] |= { name: .measurement, aggregation: { function: .aggregation, step } }
    

    要让它工作,你只是缺少括号。

    .fields_selected = .fields_selected | ...
    

    意思

    ( .fields_selected = .fields_selected ) | ...
    

    应该是

    .fields_selected = ( .fields_selected | ... )
    

    这给了我们

    .fields_selected = (
       .fields_selected |
       map({
          name: .measurement,
          aggregation: {
             function: .aggregation,
             step: .step
          }
       })
    )
    

    Demo on jqplay


    但我们可以改进这一点。 foo = ( foo | ... )一般可以写成foo |= ( ... )

    .fields_selected |= map({
       name: .measurement,
       aggregation: {
          function: .aggregation,
          step: .step
       }
    })
    

    我们可以修改 fields 数组中的对象而不是数组本身。

    .fields_selected[] |= {
       name: .measurement,
       aggregation: {
          function: .aggregation,
          step: .step
       }
    }
    

    最后,{ foo: .foo, ... } 可以缩短为{ foo, ... }

    .fields_selected[] |= {
       name: .measurement,
       aggregation: {
          function: .aggregation,
          step
       }
    }
    

    作为一个简单的单行:

    jq '.fields_selected[] |= { name: .measurement, aggregation: { function: .aggregation, step } }'
    

    Demo on jqplay

    【讨论】:

      【解决方案2】:

      我能够弄清楚我做错了什么:

      jq  '.fields_selected = (.fields_selected | map({name : .measurement , aggregation : {step: .step , function: .aggregation}}))' config-it-client.json 
      

      【讨论】:

      • 您可以进一步缩短为jq '.fields_selected |= map({name: .measurement, aggregation: {step, function: .aggregation}})' config-it-client.json
      • @pmf,您甚至可以使用.fields_selected[] 删除map()
      • @ikegami 我更新了结果,现在为错误感到遗憾
      猜你喜欢
      • 2019-07-28
      • 1970-01-01
      • 2013-10-22
      • 2021-06-29
      • 1970-01-01
      • 2022-11-10
      • 2021-05-24
      • 2011-11-01
      • 2018-05-04
      相关资源
      最近更新 更多