質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

3回答

1405閲覧

rubyでjsonの中からある値を取得したい

good1000

総合スコア2

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

1クリップ

投稿2022/08/17 09:11

編集2022/08/17 11:22

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 09:36

それは JSON として正しいのでしょうか?
good1000

2022/08/17 10:27

すみません、JSONの理解が足りてないようです。もっと長いのですが部分的に切り抜いてしまいました。
退会済みユーザー

退会済みユーザー

2022/08/17 11:00

質問文は編集できるので訂正願います。
good1000

2022/08/17 11:22

修正しました。
退会済みユーザー

退会済みユーザー

2022/08/17 12:31

そうではなくて、JSON として正しくないので、それを正してくださいというお願いです。
good1000

2022/08/17 13:40

それは長くて無理なのでここではできないと思いました。
退会済みユーザー

退会済みユーザー

2022/08/17 14:18 編集

他の方が回答に書いているように、質問の文字列を [ と ] で囲むだけで少なくとも JSON としては正しくなるのが分かりませんか? ただ、それをベースにしてあなたの期待する回答が出せるかは分かりません。だからせっかく回答をもらっても解決に至らないのではないですか? 話が通じる程度には知識をつけないと・・・
guest

回答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

melian

総合スコア19805

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

good1000

2022/08/17 10:43

すみません、このテキストをそのままファイルにして実行しましたがエラーになってしまいました。 当方バージョンruby 2.7.6です。
melian

2022/08/17 11:00

Safe navigation operator が導入されたのは Ruby 2.3.0 なので問題はないかと思いますが、具体的にはどうの様なエラーが発生したのでしょうか?
good1000

2022/08/17 12:09 編集

恐れ入ります。このようなエラーです。 syntax error, unexpected '.' id = json_obj.select{|i| i[:name] == "02"}&.[](0)&.[](:id)        
melian

2022/08/17 12:18 編集

syntax error と表示されていますので、そちらのお使いの Ruby のバージョンが実際には 2.3.0 よりも前のバージョンなのかな、と思います。
good1000

2022/08/17 12:22 編集

そうなんですか・・・。 ruby -v で2.7.6と出るのですが。。実際にはもっと古いバージョンという事なのでしょうか。
melian

2022/08/17 12:35

いえ、「ruby -v で2.7.6と出る」ということなので 2.7.6 であることは確かですね。。。
kts_h

2022/08/18 11:31

Ruby 2.5.5 では正常に動作します。
kts_h

2022/08/18 11:37

id = json_obj.find { |e| e[:name] == "02" } &.dig(:id) や id = json_obj.find { |e| e[:name] == "02" } &.fetch(:id) でと、どうですか?
guest

0

大きく2つの問題があり、このデータ専用のソフトを作らないとだめですね。
で、これが処理できるプログラムをつくっても、同じような次のデータをとってきたときに使えるものにはならない可能性が高い
問題

  1. データとしておかしい。一つの変数に代入できる形ではないし。
  2. データの構造が一定ではないから、構造をコツコツたどる処理が必要

これ データとしておかしいですね。
これを foo.rb とでもいう fileのコピペして、Rubyの整形ができるeditorで整形してみてください。
一つのデータではなく

{ } [ ]

という、配列とハッシュの 2つの データが並んでいます。カンマによる区切りも 全体を [] で囲むということもなく。
ということはこのデータはそのままでは一つの変数に代入できません。
ということは、この元になっている文字列な JSONデータを パースすると(JSONの)文法エラーになるんじゃないかな。

どのようにしてこのデータを入手できるのかわかりませんが、JSONとして正しい形で入手できるようにして行う

手作業で2つに分けて処理するか。

構造をコツコツたどる処理が必要
ハッシュの方は、値が単純な場合もあればハッシュの場合がある、そしてその中がさらに ハッシュを要素にもつ配列だったりする
[ ] の部分が、単純な値の場合もあるしハッシュの場合もある。そしてハッシュの構造は様々

ということで

同じような処理を色々なデータで行うのなら、複数パターンを取り寄せてデータの構造の規則性を見つけだす ところからはじめてください
このデータのみでおこなうなら、整形して読みやすくしてから、手作業で抜き出してください

投稿2022/08/18 02:39

winterboum

総合スコア23347

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

good1000

2022/08/18 03:50

申し訳ございません。長いデータから抜粋してしまいました。やり直します。。
winterboum

2022/08/18 03:58

データの構造に関する情報は無いのですか?
winterboum

2022/08/18 03:59

それと 抜粋は必要です でも正しく抜粋してください。 それができないようでしたら、この仕事は無理です
guest

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

otn

総合スコア84559

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

good1000

2022/08/17 10:47

すみません、こちらを参考にして実行しましたがエラーになってしまいました。 当方のrubyのバージョンは2.7.6です。
otn

2022/08/17 12:38

> エラーになってしまいました。 どんなデータで、どんなエラーですか?
good1000

2022/08/17 13:40

すみません、データはBOX cliのデータで例題より長いデータになります。切り出してしまったらダメでしたでしょうか。エラーはundefined method 'filter_map' と出ました。
otn

2022/08/17 15:07

Rubyのバージョンが古いのでしょうね。 p data.select{|x| x["name"]=="02"}.map{|x| x["id"]} は?
otn

2022/08/17 16:05

filter_map は、Ver2.7以降の機能ですね。それより古いバージョンを使っているとは考えにくいのですが。 あるいは、データがおかしい?エラーメッセージ全文は?情報を小出しにされると話がなかなか進まないのですが。 データはHashのArrayなのですよね? 回答冒頭に、 > 全体を囲む[ ]が漏れていると言うことですかね。 と書いてるのですが、読んでませんか?
good1000

2022/08/17 17:00

ありがとうございます。記載したのがエラー全文です。p data.select{|x| x["name"]=="02"}.map{|x| x["id"]}はエラーなしで、[]の何も入ってない?状態でした。 例題のhashは抜き出したものです。本来はもっと長かったため切り出してしまいました。 多分それが原因なのではと思っています。すみません、すごく長くって載せるのに躊躇してしまいました。 この式を使えば、hashの複雑なものでも値は取れるのでしょうか。
otn

2022/08/17 23:32 編集

「データはHashのArrayのJSONなのですよね?」に対する回答が無いです。 YESであれば、質問に書くのは、抽出されるべき1つのHashだけでいいです。 > []の何も入ってない?状態でした。 抽出条件に合うデータが無かったのでしょう。 > 記載したのがエラー全文です。 そんな訳ありません。
good1000

2022/08/18 00:59

お忙しい所、ありがとうございます。長いですが、データを載せます。 この中かからnameを指定してidを取得したいです。 お手数おかけしてすみません。 {"type"=>"folder", "id"=>"169904650539", "sequence_id"=>"1", "etag"=>"1", "name"=>"05", "created_at"=>"2022-08-16T22:06:55-07:00", "modified_at"=>"2022-08-16T23:39:38-07:00", "description"=>"", "size"=>0, "path_collection"=>{"total_count"=>2, "entries"=>[{"type"=>"folder", "id"=>"0", "sequence_id"=>nil, "etag"=>nil, "name"=>"All Files"}, {"type"=>"folder", "id"=>"169293207390", "sequence_id"=>"1", "etag"=>"1", "name"=>"2022"}]}, "created_by"=>{"type"=>"user", "id"=>"20179333466", "name"=>"jwttest", "login"=>"AutomationUser_1830860_6xGtRdxslB@boxdevedition.com"}, "modified_by"=>{"type"=>"user", "id"=>"20063589478", "name"=>"Bill", "login"=>"MJ@yahoo.co.jp"}, "trashed_at"=>nil, "purged_at"=>nil, "content_created_at"=>"2022-08-16T22:06:55-07:00", "content_modified_at"=>"2022-08-16T23:39:38-07:00", "owned_by"=>{"type"=>"user", "id"=>"20063589478", "name"=>"Bill", "login"=>"MJ@yahoo.co.jp"}, "shared_link"=>nil, "folder_upload_email"=>nil, "parent"=>{"type"=>"folder", "id"=>"169293207390", "sequence_id"=>"1", "etag"=>"1", "name"=>"2022"}, "item_status"=>"active", "item_collection"=>{"total_count"=>4, "entries"=>[{"type"=>"folder", "id"=>"169909582976", "sequence_id"=>"0", "etag"=>"0", "name"=>"01"}, {"type"=>"folder", "id"=>"169909016593", "sequence_id"=>"0", "etag"=>"0", "name"=>"02"}, {"type"=>"folder", "id"=>"169910293347", "sequence_id"=>"0", "etag"=>"0", "name"=>"03"}, {"type"=>"folder", "id"=>"169904582432", "sequence_id"=>"2", "etag"=>"2", "name"=>"20"}], "offset"=>0, "limit"=>100, "order"=>[{"by"=>"type", "direction"=>"ASC"}, {"by"=>"name", "direction"=>"ASC"}]}} ["folder", "169904650539", "1", "1", "05", "2022-08-16T22:06:55-07:00", "2022-08-16T23:39:38-07:00", "", 0, {"total_count"=>2, "entries"=>[{"type"=>"folder", "id"=>"0", "sequence_id"=>nil, "etag"=>nil, "name"=>"All Files"}, {"type"=>"folder", "id"=>"169293207390", "sequence_id"=>"1", "etag"=>"1", "name"=>"2022"}]}, {"type"=>"user", "id"=>"20179333466", "name"=>"jwttest", "login"=>"AutomationUser_1830860_6xGtRdxslB@boxdevedition.com"}, {"type"=>"user", "id"=>"20063589478", "name"=>"Bill", "login"=>"MJ@yahoo.co.jp"}, nil, nil, "2022-08-16T22:06:55-07:00", "2022-08-16T23:39:38-07:00", {"type"=>"user", "id"=>"20063589478", "name"=>"Bill", "login"=>"MJ@yahoo.co.jp"}, nil, nil, {"type"=>"folder", "id"=>"169293207390", "sequence_id"=>"1", "etag"=>"1", "name"=>"2022"}, "active", {"total_count"=>4, "entries"=>[{"type"=>"folder", "id"=>"169909582976", "sequence_id"=>"0", "etag"=>"0", "name"=>"01"}, {"type"=>"folder", "id"=>"169909016593", "sequence_id"=>"0", "etag"=>"0", "name"=>"02"}, {"type"=>"folder", "id"=>"169910293347", "sequence_id"=>"0", "etag"=>"0", "name"=>"03"}, {"type"=>"folder", "id"=>"169904582432", "sequence_id"=>"2", "etag"=>"2", "name"=>"20"}], "offset"=>0, "limit"=>100, "order"=>[{"by"=>"type", "direction"=>"ASC"}, {"by"=>"name", "direction"=>"ASC"}]}]
otn

2022/08/18 02:46

「データはHashのArrayのJSONなのですよね?」に対する回答が無いです。三度目の質問です。
good1000

2022/08/18 03:00

ごめんなさい、JSONの自分の理解が足りてないです。このデータは JSON.parseしたハッシュですよね。。 JSON.parseしていないデータで行っても検索できませんでした。
otn

2022/08/18 03:45

質問文のデータは、同じ形式のハッシュが複数個ならんだものに見えますが、これがそもそも間違っていたと言うことですか?であれば、質問文を書き直しましょう。ゼロからやり直しです。
good1000

2022/08/18 03:47

申し訳ありません。やり直します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問