用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 在片段中填充列表视图

jq 以 JSON 格式输出结果

错误代码:错误域 = NSCocoaErrorDomain 代码 = 3840“JSON 文本没有以数组或对象和允许未设置片段的选项开头。”

jq:json对象的输出数组[重复]

jq处理JSON数据

如何使用 JQ 转换此 JSON 数据以依次将每个嵌套数组元素提取到顶层?