微调jq过滤器以减少过滤器字符串中的重复

时间:2018-06-22 10:34:24

标签: json csv jq

我有一个通过API调用生成的复杂JSON对象(在此gist中找到了完整的JSON)。它描述了实体的属性(字段,参数,子关系等)。我尝试使用jq来提取一个子字段数组并将其转换为CSV,其中字段键是单个标题行,每个数组项的值形成后续行。 (注意:字段在数组中的所有项目之间都是统一的。)

到目前为止,我已经成功了,但是我觉得我的jq过滤器字符串可能会更好,因为重复了将这个数组解压缩到两个单独的过滤器中的过程。

这是JSON的简化版本,以供参考:

    {
        ...
        "result": {
            ... 
            "fields": [
                {
                    "aggregatable": true,
                    "aiPredictionField": false,
                    "autoNumber": false,
                    "byteLength": 18,
                    "name": "Id",
                    ...
                },
                {
                    "aggregatable": true,
                    "aiPredictionField": false,
                    "autoNumber": false,
                    "byteLength": 18,
                    "name": "OwnerId",
                    ... 
                },
                {
                    "aggregatable": false,
                    "aiPredictionField": false,
                    "autoNumber": false,
                    "byteLength": 0,
                    "name": "IsDeleted",
                    ...
                },
                ...
            ],
            ...
        }
    }

到目前为止,这是有效的命令:

jq -r '.result.fields | (.[0] | keys) , .[] | [.[] | tostring] | @csv'

repeated array unpacking---^-------------^

对此我可能很满意,但是我更喜欢在第一个过滤器中解压缩result.fields数组,以便它像这样开始:

jq -r '.result.fields[] | ...

仅是不再有数组,只有一组对象。我尝试了几件事,但没有一个给我我想要的东西。在我意识到解压缩.result.fields[]之前,我尝试了两件事,破坏了我可以使用的任何类似数组的东西(是的,这里的学习者很慢,而且可能有点厚):

jq -r '.result.fields[] | ( keys | .[0] ) , [.[] | tostring] | @csv'
jq -r '.result.fields[] |  keys[0]  , [.[] | tostring] | @csv' 

所以真正的问题是:我可以一次解开result.fields的包装,然后使用能给我带来什么的东西吗?如果不是,是否有更有效的方法来找到我正在寻找的CSV结构?

1 个答案:

答案 0 :(得分:1)

  1. 您的代码有错误,因为keys对密钥进行了排序。这里需要的是keys_unsorted

  2. 如果要在一次jq调用中完成所有操作,则无法使用result.fields[]启动管道。

  3. 以下内容确实避免了方法的一种非常小的效率:

.result.fields | (.[0] | keys_unsorted), (.[] | [.[] | tostring]) | @csv