我有一个通过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结构?
答案 0 :(得分:1)
您的代码有错误,因为keys
对密钥进行了排序。这里需要的是keys_unsorted
。
如果要在一次jq调用中完成所有操作,则无法使用result.fields[]
启动管道。
以下内容确实避免了方法的一种非常小的效率:
.result.fields
| (.[0] | keys_unsorted),
(.[] | [.[] | tostring])
| @csv