2016-03-26 140 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" 
} 
相關問題