rubyでjsonの中からある値を取得したい場合についてお尋ねします。
例えば以下のjsonの中からnemeが02の所のID番号を取得したい場合はどうすればいいのでしょうか。
よろしくお願いします。
{
"type": "folder",
"id": "1234567890",
"sequence_id": "0",
"etag": "0",
"name": "01"
},
{
"type": "folder",
"id": "2345678901",
"sequence_id": "0",
"etag": "0",
"name": "02"
},
{
"type": "folder",
"id": "3456789012",
"sequence_id": "0",
"etag": "0",
"name": "03"
},
{
"type": "folder",
"id": "4567890123",
"sequence_id": "0",
"etag": "0",
"name": "04"
}
このjsonは本来のものではなく、切り出した状態のものです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/08/17 10:27
退会済みユーザー
2022/08/17 11:00
2022/08/17 11:22
退会済みユーザー
2022/08/17 12:31
2022/08/17 13:40
退会済みユーザー
2022/08/17 14:18 編集
回答3件
0
Safe navigation operator を使う場合。
ruby
1require "json" 2 3string = <<JSON 4[{ 5 "type": "folder", 6 "id": "1234567890", 7 "sequence_id": "0", 8 "etag": "0", 9 "name": "01" 10}, 11{ 12 "type": "folder", 13 "id": "2345678901", 14 "sequence_id": "0", 15 "etag": "0", 16 "name": "02" 17}, 18{ 19 "type": "folder", 20 "id": "3456789012", 21 "sequence_id": "0", 22 "etag": "0", 23 "name": "03" 24}, 25{ 26 "type": "folder", 27 "id": "4567890123", 28 "sequence_id": "0", 29 "etag": "0", 30 "name": "04" 31}] 32JSON 33 34json_obj = JSON(string, symbolize_names: true) 35id = json_obj.select{|i| i[:name] == "02"}&.[](0)&.[](:id) 36p id
投稿2022/08/17 09:47
総合スコア19805
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/08/17 10:43
2022/08/17 11:00
2022/08/17 12:09 編集
2022/08/17 12:18 編集
2022/08/17 12:22 編集
2022/08/17 12:35
2022/08/18 11:31
2022/08/18 11:37
0
大きく2つの問題があり、このデータ専用のソフトを作らないとだめですね。
で、これが処理できるプログラムをつくっても、同じような次のデータをとってきたときに使えるものにはならない可能性が高い
問題
- データとしておかしい。一つの変数に代入できる形ではないし。
- データの構造が一定ではないから、構造をコツコツたどる処理が必要
これ データとしておかしいですね。
これを foo.rb とでもいう fileのコピペして、Rubyの整形ができるeditorで整形してみてください。
一つのデータではなく
{ } [ ]
という、配列とハッシュの 2つの データが並んでいます。カンマによる区切りも 全体を [] で囲むということもなく。
ということはこのデータはそのままでは一つの変数に代入できません。
ということは、この元になっている文字列な JSONデータを パースすると(JSONの)文法エラーになるんじゃないかな。
どのようにしてこのデータを入手できるのかわかりませんが、JSONとして正しい形で入手できるようにして行う
か
手作業で2つに分けて処理するか。
構造をコツコツたどる処理が必要
ハッシュの方は、値が単純な場合もあればハッシュの場合がある、そしてその中がさらに ハッシュを要素にもつ配列だったりする
[ ] の部分が、単純な値の場合もあるしハッシュの場合もある。そしてハッシュの構造は様々
ということで
同じような処理を色々なデータで行うのなら、複数パターンを取り寄せてデータの構造の規則性を見つけだす ところからはじめてください
このデータのみでおこなうなら、整形して読みやすくしてから、手作業で抜き出してください
投稿2022/08/18 02:39
総合スコア23347
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/08/18 03:50
2022/08/18 03:58
2022/08/18 03:59
0
全体を囲む[ ]
が漏れていると言うことですかね。
Ruby
1data = JSON.parse(json) 2p data.filter_map{|x| x["name"]=="02" && x["id"]} 3正確には、 4p data.select{|x| x["name"]=="02"}.map{|x| x["id"]}
投稿2022/08/17 09:31
総合スコア84559
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/08/17 10:47
2022/08/17 12:38
2022/08/17 13:40
2022/08/17 15:07
2022/08/17 16:05
2022/08/17 17:00
2022/08/17 23:32 編集
2022/08/18 00:59
2022/08/18 02:46
2022/08/18 03:00
2022/08/18 03:45
2022/08/18 03:47
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。