想象一下类似的数据:
[{
"names": {
"official_full": "John Smith",
"nickname": "Johnny"
},
"positions": [{
"start": "1993-01-05",
"end": "2002-12-03",
"title": "Executive VP of Operations",
"city": "Winnipeg",
"state": "Michigan"
}, ...]
}, ...]
是否可以在jq中对数据进行标准化,如下所示?
{
people: [{
"full_name": "John Smith"
}, ...],
terms: [{
"start": "1993-01-05",
"end": "2002-12-03",
"person": 1,
"job": 0
}, ...],
jobs: [{
"title": "Executive VP of Operations",
"location": 0
}, ...],
locations: [{
"city": "Winnipeg",
"state": "Michigan"
}, ...]
}
我是jq的新手,所以我不知道从哪里开始。我的主要问题是如何预先创建一个对象,然后在迭代传入的json时填充该对象,即
{
people: [],
terms: [],
jobs: [],
locations: []
}
如何获取附加对象的索引?
我不确定这对jq来说是否容易。我可能只是使用normalizrjs编写一个nodejs脚本。
另一个问题是确保job
或location
之类的对象不会重复,因此我要确保没有重复的对象领域。我觉得这可能不是那么难。我只需要在插入对象之前将对象与数组中的对象进行比较
答案 0 :(得分:1)
如果我正确理解了您的问题,您应该能够使用reduce
按照以下方式完成您想要的任务:
reduce .[] as $o
({
people: [],
terms: [],
jobs: [],
locations: []
}; ......
)
请参阅有关reduce
的jq文档,但简而言之,您将使用jq指令替换......以构建规范化表示。
检查重复项的最简单方法可能是使用index/1
。我建议使用辅助函数(def ...
)来保持易读性和易于维护。
如果你需要生成一个数字id,那么使用这个成语可能更容易:
. as $in | reduce range(0;length) as $i (INITIAL; $in[$i] as $o | ......)