首页 > 解决方案 > 如果每个对象不存在,则使用 jq 在每个对象中插入一个键值对

问题描述

我正在尝试在 JSON 文件的每一行中添加一个特定的关键字,如果它不存在的话。

我的初始文件:

[{"type": "STRING", "name": "Article"},
{"type": "STRING", "name": "Sellable_UOM"},
{"type": "STRING", "name": "PriceFamilyCode"},
{"type": "STRING", "name": "PriceFamilyDescription"},
{"type": "STRING", "name": "SalesDistrict"},
{"type": "DATE", "name": "FiscalWeekendDate"},
{"type": "STRING", "mode": "REPEATED", "name": "export_sql"},
{"type": "STRING", "mode": "REPEATED", "name": "post_sql"}]

预期输出:

[{"type": "STRING", "mode": "NULLABLE", "name": "Article"},
{"type": "STRING", "mode": "NULLABLE", "name": "Sellable_UOM"},
{"type": "STRING", "mode": "NULLABLE", "name": "PriceFamilyCode"},
{"type": "STRING", "mode": "NULLABLE", "name": "PriceFamilyDescription"},
{"type": "STRING", "mode": "NULLABLE", "name": "SalesDistrict"},
{"type": "DATE", "mode": "NULLABLE", "name": "FiscalWeekendDate"},
{"type": "STRING", "mode": "REPEATED", "name": "export_sql"},
{"type": "STRING", "mode": "REPEATED", "name": "post_sql"}]

要求: 如果该行包含模式值,则将其插入为“模式”:“NULLABLE”在类型和名称属性之间。

我想要达到的最终结果是从上面的预期输出中获取字段及其对应的日期类型和模式,如下所示。

最后结果:

    Article,STRING,NULLABLE 
    Sellable_UOM,STRING,NULLABLE
    PriceFamilyCode,STRING,NULLABLE
    PriceFamilyDescription,STRING,NULLABLE
    SalesDistrict,STRING,NULLABLE
    FiscalWeekendDate,DATE,NULLABLE
    export_sql,STRING,REPEATED
    post_sql,STRING,REPEATED

我试图实现的命令来自预期的输出 json,

jq -r '.[] |[ .name, .type, .mode]|@csv'  file1.json | sed s/'"'//g

标签: jsonjq

解决方案


下面的程序通过在每个没有键的对象的键和键mode: "NULLABLE"之间插入对来产生预期的输出。typenamemode

map(select(has("mode") | not) |= {type, mode: "NULLABLE", name})

但是,如果这里的目的是将输入 JSON 转换为 CSV,我认为不需要中间结构。假设mode不存在或非空值,备用运算符可用于直接转换,如下所示。

.[] | [.type, .mode // "NULLABLE", .name] | @csv

推荐阅读