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

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

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

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

Q&A

解決済

1回答

1293閲覧

APIから送られてきたJSON型ファイルからデータを取り出したい。

Raleigh

総合スコア8

Ruby

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

0グッド

0クリップ

投稿2020/05/14 10:30

前提・実現したいこと

楽天商品検索APIを使って送られてきたJSON形式のデータをハッシュに変換したあと、特定のキーに対応する値を取得したいのですがうまくいきません。最後の部分の記述方法を教えて欲しいです。

該当のソースコード

ruby

1puts "検索したい文言を入力してください!" 2search_word = gets.chomp 3 4appid = ENV["RAKUTEN_APP_ID"] 5 6url = URI.parse(URI.escape("https://app.rakuten.co.jp/services/api/IchibaItem/Search/20140222?applicationId=#{appid}&keyword=#{search_word}")) 7res = Net::HTTP.start(url.host, url.port, use_ssl: true){|http| 8 http.get(url.path + "?" + url.query); 9} 10 11obj = JSON.parse(res.body) 12puts obj[:Item][:itemName]

補足情報(FW/ツールのバージョンなど)

ちなみにハッシュに変換した後のデータは、以下のようになっています。

{"Item"=>{"mediumImageUrls"=>[{"imageUrl"=>"http://thumbnail.image.rakuten.co.jp/@0_mall/mobge.rakuten.co.jp/@0_mall/mobilestation/cabinet/_049/1240001014344_2-2.jpg?_ex=128x128"}, {"imageUrl"=>"http://thumbnail.image.rakuten.co.jp/@0_mall/mobilestation/cabinet/_049/1240001014344_3-2.jpg?_ex=128x128"}], "pointRate"=>1, "shopOfTheYearFlag"=>0, "affiliateRate"=>2, "shipOverseasFlag"=>0, "asurakuFlag"=>0, "endTime"=>"", "taxFlag"=>0, "startTime"=>"", "itemCaption"=>"なしキャリアロック解除版30日間保証 永久保証 当商品はSIMロック解除品のため日本国外のSIMカードで使用できない場合がありますが、その場合は保証対象外です。IMEI355338083399332 355337084205381 355339084915654 355339083990872355338084963686353835086781467353835086164417353835086150820 355853081255336355339082522445355335084254292355850080001422 353836086400694353836085633709353835087281343355336082830240355338082956082355336083128636353837086311790353837087857635", "catchcopy"=>"中古/Apple/MPRX2J/A/iPhone/送料無料/SIMロック解除済み", "tagIds"=>[1000877, 1002851, 1002891, 1005886, 1020075, 1021161, 1021164, 1021165], "smallImageUrls"=>[{"imageUrl"=>"http://thumbnail.image.rakuten.co.jp/@0_mall/mobilestation/cabinet/_049/1240001014344_1-2.jpg?_ex=64x64"}, {"imageUrl"=>"http://thumbnail.image.rakuten.co.jp/@0_mall/mobilestation/cabinet/_049/1240001014344_2-2.jpg?_ex=64x64"}, {"imageUrl"=>"http://thumbnail.image.rakuten.co.jp/@0_mall/mobilestation/cabinet/_049/1240001014344_3-2.jpg?_ex=64x64"}], "asurakuClosingTime"=>"", "imageFlag"=>1, "availability"=>1, "shopAffiliateUrl"=>"", "itemCode"=>"mobilestation:10036932", "postageFlag"=>0, "itemName"=>"【即日発送】 【中古】Bランク SIMフリー iPhone7 128GB レッド 白ロム本体【送料無料】【スマホ専門販売店】", "itemPrice"=>24980, "pointRateEndTime"=>"", "shopCode"=>"mob ilestation", "affiliateUrl"=>"", "giftFlag"=>0, "shopName"=>"携帯販売のモバイルステーション", "reviewCount"=>32, "asurakuArea"=>"", "shopUrl"=>"http://www.rakuten.co.jp/mobilestation/", "creditCardFlag"=>1, "reviewAverage"=>4.06, "shipOverseasArea"=>"", "genreId"=>"560202", "pointRateStartTime"=>"", "itemUrl"=>"http://item.rakuten.co.jp/mobilestation/1-240001014344/"}}

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

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

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

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

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

guest

回答1

0

ベストアンサー

JSON をパースする箇所を、

ruby

1obj = JSON.parse(res.body, symbolize_names: true)

に変更するか、パース後の結果から値を取り出す部分を、

ruby

1puts obj['Item']['itemName']

と変更すれば、所望の値を取り出すことが出来るかと思います。

投稿2020/05/14 10:36

taichi730

総合スコア318

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

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

Raleigh

2020/05/14 10:41

回答ありがとうございます! 後者の方を試してみたのですが、 undefined method `[]' for nil:NilClass (NoMethodError) というエラーが出てきます。これは他のデータに欠損値があるからこのようなエラーが出るのですか?
taichi730

2020/05/14 11:05

貼り付けられている、パース後のハッシュが正しいなら、回答通りのコードで取り出せるかと。
Raleigh

2020/05/14 12:44

すいません取り出すことできました!ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問