2016-03-26 98 views
0

鉴于我从掌上API的响应收到以下test.json如何提升嵌套两层深度的JSON对象的值?

{ 
"complete": 1, 
"error": null, 
"list": { 
    "1000055792": { 
     "excerpt": "Some Text", 
     "favorite": "0", 
     "given_title": "Some Title", 
     "given_url": "Some URL", 
     "has_image": "0", 
     "has_video": "0", 
     "is_article": "1", 
     "is_index": "0", 
     "item_id": "1000055792", 
     "resolved_id": "1000055792", 
     "resolved_title": "Title", 
     "resolved_url": "Some URL", 
     "sort_id": 700, 
     "status": "1", 
     "time_added": "1438646514", 
     "time_favorited": "0", 
     "time_read": "1439025088", 
     "time_updated": "1439025090", 
     "word_count": "10549" 
    }, 
    "1000102810": { 
     "excerpt": "Some Text", 
     "favorite": "0", 
     "given_title": "Title", 
     "given_url": "Some URL", 
     "has_image": "1", 
     "has_video": "0", 
     "is_article": "1", 
     "is_index": "0", 
     "item_id": "1000102810", 
     "resolved_id": "1000102810", 
     "resolved_title": "Title", 
     "resolved_url": "Resolved URL", 
     "sort_id": 650, 
     "status": "1", 
     "time_added": "1440303789", 
     "time_favorited": "0", 
     "time_read": "1440320729", 
     "time_updated": "1440320731", 
     "word_count": "3219" 
    } 

如何访问键的值一样resolved_titleword_count。它们嵌套在一个数字的对象内,与id相同,它本身嵌套在list的内部。我搜索并找到了一种使用jq访问嵌套对象的方法。但是,如何访问嵌入在主list对象内的另一个对象内的值?

此外,ID是不同的,不顺序,所以我不认为递归是可能的,但我可能是错的。我打算对这些数据进行的操作是仅提取每个项目的resolved_titleword_count值,并将它们保存为两列电子表格。

在此先感谢!

+0

什么语言你在做这个吗? JavaScript的?你添加了“命令行”标签,那么你是否使用node.js?或其他一些语言? –

+0

@KenB问题和标签都提及[标签:jq] – tripleee

+0

啊对不起,我以为'jq'意味着jQuery,现在我看到它是一个命令行工具用于浏览JSON –

回答

0

您可以使用.[]运算符遍历数组中的所有元素(或者在此例中为所有键)。下面将给出在单独的行你与每个场输出:

cat <file_with_json> | jq '.list | .[] | .resolved_title, .word_count' 

所述第一过滤器上仅操作list元件。第二个筛选器说for every element,最后输出只是resolved_title.word_count字段。这将产生以下:

"Title" 
"3219" 
"Title" 
"10549" 
+0

感谢您的帮助。有效。您提到“第一个过滤器只对'list'元素进行操作......”。通过过滤器,我认为你的意思是'.list'部分,或者我错了吗? –

+0

这是正确的 - '.list'是一个过滤器,意思是“获取列表值” – tddmonkey

0

尝试map()

$ cat myfile.json | jq '.list | map({resolved_title: .resolved_title, word_count: .word_count})' 
[ 
    { 
    "resolved_title": "Title", 
    "word_count": "10549" 
    }, 
    { 
    "resolved_title": "Title", 
    "word_count": "3219" 
    } 
] 
+0

它的工作,谢谢。有点偏离主题,但如果你不介意的话,我可以问另一个与命令行有关的问题吗?我可以将某个命令的输出作为输入提供给另一个命令,而无需将中间结果保存为文件。我的意思是,我可以使用命令从Pocket下载我的数据,并使用'>'运算符将它传递到您编写的代码上?再次感谢。:) –

+0

只要掌上电脑支持发送到标准输出 – tddmonkey

+0

@AkhilUnnikrishnan是啊,你可以通过管道输出口袋到jq,任何输出到终端的命令都可以通过管道字符('|')输入到'jq'中。 '),并且包括使用'>'将其输出重定向到文件中的任何命令 –

0

下可以很容易地扩展和/或调整:

> jq ".list[] | {resolved_title, word_count}" input.json 

输出:

{ 
    "resolved_title": "Title", 
    "word_count": "10549" 
} 
{ 
    "resolved_title": "Title", 
    "word_count": "3219" 
} 
相关问题