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

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

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

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

Ruby on Rails

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

Q&A

解決済

2回答

3758閲覧

ネストしているJSONから任意のキーを配列で取り出す方法

guitar-guitar

総合スコア42

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2017/09/13 13:50

railsで構築中のWEBアプリケーションで、画面に表示する値をネストしているJSONから取得しています。
例えば以下のようなJSON

JSON

1{ 2"filesystem": { 3 "by_device": { 4 "/dev/xvda1": { 5 "kb_size": "6192704", 6 "fs_type": "ext4", 7 "mounts": [ 8 "/" 9 ] 10 }, 11 "tmpfs": { 12 "kb_size": "509300", 13 "fs_type": "tmpfs", 14 "mounts": [ 15 "/dev/shm" 16 ] 17 } 18}

データの取得方法で特定のキーを指定して取得することはできます。
↓これはOKパターン
※実際にはJSONファイルは別のアプリケーションから取得しています。

ruby

1# メソッド 2 def show 3 @node = "json形式のファイル" 4 end 5 6# html側のコード 7<%= @node.filesystem["filesystem2"]["by_device"]["/dev/xvda1"]["fs_type"] %> 8<%= @node.filesystem["filesystem2"]["by_device"]["tmpfs"]["fs_type"] %> 9

しかしながら、
同じ階層のデータの数だけループ処理で表示させたいのですが

<%= @node.filesystem["filesystem2"]["by_device"]["/dev/xvda1"]["fs_type"] %>
<%= @node.filesystem["filesystem2"]["by_device"]["tmpfs"]["fs_type"] %>

**["/dev/xvda1"]["tmpfs"]**が異なるキーのため以下の用に書き換えたのですがうまく行きませんでした。
何か良い方法はないでしょうか?
目指したこととしては、["by_device"]の"0"番目に入っているキーを取得したいと考えていました。

ruby

1<%= @node.filesystem["filesystem2"]["by_device"][0]["fs_type"] %> 2<%= @node.filesystem["filesystem2"]["by_device"][0]["fs_type"] %>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

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

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

guest

回答2

0

ベストアンサー

こういう事がしたいのでしょうか?テストしてませんが、

Ruby

1<% @node.filesystem["filesystem2"]["by_device"].each_key do |k| %> 2<%= @node.filesystem["filesystem2"]["by_device"][k]["fs_type"] %> 3<% end %>

投稿2017/09/13 15:06

otn

総合スコア84421

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

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

guitar-guitar

2017/09/14 04:01 編集

ご回答いただきありがとうございます! まさにやりたいことです! 試してみましたが undefined method `each' for でエラーになってしまいますね。。。 別の原因かもしれないのでもう少し頑張ってみますが 取得したJSON形式のデータを”配列”で@nodeに入っていないのでeach_kyeができないきがしました・・・。
guitar-guitar

2017/09/14 09:19

to_hashをプラスしたらできました! <% binding.pry %>モードにして利用できるメソッドを@node.methodsで調べたらeach_keyが出てこなかったのでクラスが違うことに気が付きました。 <% @node.filesystem["filesystem2"]["by_device"].to_hash.each_key do |k| %> <%= @node.filesystem["filesystem2"]["by_device"][k]["fs_type"] %> <% end %> ご支援いただきありがとうございました!
guest

0

ただ、あたいだけを取り出したいのであれば

ruby

1j.to_s.scan(/:fs_type=>"(.*?)",/).flatten

jはJSONをパースしたHashです。

投稿2017/09/14 05:24

NCC1701

総合スコア1680

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

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

guitar-guitar

2017/09/14 09:20

ご回答いただきありがとうございます! 何処かで試してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問