用JQ填充JSON数组以获得矩形结果
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用JQ填充JSON数组以获得矩形结果相关的知识,希望对你有一定的参考价值。
我有json看起来像this(链接中的jq播放),我想在最后构建csv看起来像这样(底部可重现的样本)。
"SO302993",items1,item2,item3.1,item3.2,item3.3, item3.4,...
"SO302994",items1,item2,item3.1,item3.2, , ,...
"SO302995",items1,item2,item3.1,item3.2,item3.3, ,...
item3元素是一个数组和我当前的解决方案:
.[] | [.number, .item1, item2, item3[]?]
给我这个:
"SO302993",items1,item2,item3.1,item3.2,item3.3, item3.4,...
"SO302994",items1,item2,item3.1,item3.2,...
"SO302995",items1,item2,item3.1,item3.2,item3.3,...
这将在csv中创建不均匀的列数。
我尝试在Python风格中添加.item3[:]?
,但它没有用。
任何帮助将非常感激!如果我不清楚,请要澄清!我的代码段和玩具数据位于上面的链接中。
{
"items": [
{
"name": "Mr Simon Mackin",
"country_of_residence": "Scotland",
"natures_of_control": [
"voting-rights-25-to-50-percent-limited-liability-partnership",
"significant-influence-or-control-limited-liability-partnership"
],
"premises": "4"
}
]
}
{
"items": [
{
"name": "Mrs Simonne Mackinni",
"country_of_residence": "France",
"natures_of_control": [
"significant-influence-or-control-limited-liability-partnership"
],
"premises": "4"
}
]
}
使用此查询:
.items[] | [.name, .country_of_residence, .natures_of_control[]?, .premises] | @csv
我得到了这个结果
"Mr Simon Mackin","Scotland","voting-rights","significant-influence","4"
"Mrs Simonne Mackinni","France","significant-influence","4"
但是我想得到这个(第二行在“重要影响”之后有额外的逗号)。
"Mr Simon Mackin","Scotland","voting-rights","significant-influence","4"
"Mrs Simonne Mackinni","France","significant-influence",,"4"
答案
由于您需要矩形结果,因此您必须“填充”“natures_of_control”数组。根据样本输入,您需要“啜饮”输入以获得全局最大值。
要填充数组,您可以使用辅助函数:
# emit a stream of exactly $n items
def pad($n): range(0;$n) as $i | .[$i];
然后,在jqplay上发布的问题的解决方案变为:
([.[] | .items[] | .natures_of_control | length] | max) as $mx
| .[]
| (.active_count) as $active_count
| (.ceased_count) as $ceased_count
| (.links.self | split("/")[2]) as $companyCode
| .items[]
| [$companyCode, $active_count, $ceased_count, .name, .country_of_residence, .nationality, .notified_on, (.natures_of_control | pad($mx))]
| @csv
Invocation
适当的调用如下所示:
jq -sr -f program.jq input.json
处理丢失的数据
要忽略没有“项目”的对象,您可以调整上述内容,例如:如下:
([.[] | .items[]? | .natures_of_control | length] | max) as $mx
| .[]
| select(.items)
| (.active_count) as $active_count
| (.ceased_count) as $ceased_count
| (.links.self | split("/")[2]) as $companyCode
| .items[]
| [$companyCode, $active_count, $ceased_count, .name, .country_of_residence, .nationality, .notified_on, (.natures_of_control | pad($mx))]
| @csv
以上是关于用JQ填充JSON数组以获得矩形结果的主要内容,如果未能解决你的问题,请参考以下文章
使用 json rereiver php mysql 在片段中填充列表视图
错误代码:错误域 = NSCocoaErrorDomain 代码 = 3840“JSON 文本没有以数组或对象和允许未设置片段的选项开头。”