2016-03-26 5 views
0

私はポケットのAPIからの応答として受信し、次のtest.json2レベルのネストされた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の値を抽出し、2列のスプレッドシートに保存することだけです。

ありがとうございます!

+0

あなたはこれをやっていますか? JavaScript? "command-line"タグを追加したので、node.jsを使用していますか?または他の言語ですか? –

+0

@KenB質問とタグの両方に言及[タグ:jq] – tripleee

+0

ああ申し訳ありませんが、私は 'jq'はjQueryを意味すると思っていましたが、今はJSONをナビゲートするためのコマンドラインユーティリティであることがわかります –

答えて

0

演算子.[]を使用すると、配列内のすべての要素(この場合はすべてのキー)を繰り返し処理できます。以下は、別の行に各フィールドであなたの出力が得られます:

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

第一のフィルタのみlist要素で動作します。 2番目のフィルタは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

Pocketの出力をjqにパイプすることができます(Pocketがstdoutに送ることができる限り) – tddmonkey

+0

@AkhilUnnikrishnanええ、端末にテキストを出力するコマンドはパイプ文字( '| ')、それは出力をファイルにリダイレクトするために'> 'を使うコマンドを含みます –

0

次は、簡単に拡張および/または適合させることができる。

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

出力:

どの言語
{ 
    "resolved_title": "Title", 
    "word_count": "10549" 
} 
{ 
    "resolved_title": "Title", 
    "word_count": "3219" 
} 
関連する問題