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

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

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

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Ruby on Rails

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

ハッシュ

ハッシュは、高速にデータ検索を行うアルゴリズムのことです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

714閲覧

このString型のJsonデータを上手く整形できないです

widget11

総合スコア221

Ruby

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Ruby on Rails

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

ハッシュ

ハッシュは、高速にデータ検索を行うアルゴリズムのことです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2018/08/17 18:49

railsのRakefileでとあるサッカー系のwebAPIをrubyで叩くと以下の様なレスポンスが返ってきました。

#1 res = "{\"api\":{\"results\":380,\"fixtures\" :{\"65\":{\"fixture_id\":\"65\",\"event_timestamp\":\"1533927600\",\"event_date\" :\"2018-08-10T19:00:00+00:00\",\"league_id\" :\"2\",\"round\" :\"Premier League - 1\",\"homeTeam_id\":\"33\",\"awayTeam_id\": ......

このオブジェクトのクラスがStringクラスでスラッシュも邪魔なので、配列に直そうと思い以下のネットに落ちていた以下のコードを書きました

arr =res.body.split(',').map { |m| m.delete('[]"\\')}

そしてターミナルで実行して見たら以下の様な形になりました。

#2 {api:{results:380fixtures:{ 65:{ fixture_id:65 event_timestamp:1533927600 event_date:2018-08-10T19:00:00+00:00 league_id:2 round:Premier League - 1 . .省略 secondHalfStart:1533990780} 67:{fixture_id:67 event_timestamp:1533996000 event_date:2018-08-11T14:00:00+00:00 league_id:2 round:Premier League - 1 homeTeam_id:35 awayTeam_id:43 . .省略 secondHalfStart:0}}}}

この多次元配列になっているデータの値(fixture_id以降)を各々をデータベースに入れたいです。
しかし整形後のクラス確認したらArrayクラスとなっていたので、Arrayクラスのメソッドを実行したのですが、何故か値が取れません。
具体的にはこのarrに対して、arr.assoc('api')の様にassocメソッドを使っていって

65:{ fixture_id:65 event_timestamp:1533927600 event_date:2018-08-10T19:00:00+00:00 . .

この形までに持っていき、popメソッドやshiftメソッドを用い数字を消した後、

テーブル名.create(fixture_id: ブロック変数名['fixture_id'].......)

としてレコードに値を入れていくつもりでした。
しかし、何故かassocメソッドを使うと、値が全て消えて(ターミナルに表示されない)しまいます。
何故この様なことが起きているかが分かりません。

そもそもなのですが、個人的には#2を
65=>[fixture_id=>65
の様にハッシュに直してメソッドを実行しようとしてたのですが、
.to_h
メソッドを実行すると TypeError: wrong element type String at 0 (expected array)
とエラーが出た為、#2のままやっても変わらないだろうと思いメソッドを実行しました。
また#1を配列に直し方もまずいのではと感じており、ターミナルの仕様かはわからないのですが、"2のバリューとその次のキーの間にカンマ区切りがないことも気になっています。

理想としては

[
[fixture_id=>65,
event_timestamp=>1533927600,
event_date=>2018-08-10T19:00:00+00:00
..]]

この様な配列の中にハッシュが入っている形に持っていくことだったのですが。。。

長くなってしまいましたが、どの様にしたら#1の様な文字列を例に最後にあげた様な配列の形に持っていけるでしょうか?
またその他の方法でもどの様にしたら綺麗に欲しい値を取ってこれる状態にできるでしょうか。
非常に悩んでいます。質問が散在して申し訳ないですが宜しくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

require 'json' arr = JSON.parse(res)

詳しくは見ていませんけど、これじゃダメなんですかね。

投稿2018/08/17 19:32

編集2018/08/17 19:59
shozi3

総合スコア691

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

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

widget11

2018/08/17 21:10

パース試してみてダメだったんで上の他の方法試してたんですけど、今試したらできました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問