json - 如果每个对象不存在,则使用 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
解决方案
下面的程序通过在每个没有键的对象的键和键mode: "NULLABLE"
之间插入对来产生预期的输出。type
name
mode
map(select(has("mode") | not) |= {type, mode: "NULLABLE", name})
但是,如果这里的目的是将输入 JSON 转换为 CSV,我认为不需要中间结构。假设mode
不存在或非空值,备用运算符可用于直接转换,如下所示。
.[] | [.type, .mode // "NULLABLE", .name] | @csv
推荐阅读
- java - jpaitemwriter 以外的将项目写入 mariadb 的更快方法
- java - Java:继续使用标签
- perl - 逐行解析文本文件,然后将匹配的字符串放入数组中,然后输出到 csv 文件
- sql - 如何解决将数据类型 varchar 转换为 float 的错误
- c - epoll 的分段错误
- java - 为什么这个 Java 代码返回一个内存地址?
- python-3.x - Python:根据条件计算时间戳差
- sas - 在“开始”之前和“结束”之后删除观察 - SAS 代码
- xcode - 想要将 UIbutton 更改为我选择的图像
- python-3.x - 如何让 $near 在 Flask-mongoalchemy 中工作