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

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

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

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

JSON

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

Q&A

解決済

1回答

2285閲覧

JSON形式で返ってきた値の表示方法

Manamin

総合スコア14

Ruby

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

JSON

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

0グッド

0クリップ

投稿2017/09/08 08:27

編集2017/09/11 05:59

Google Place APIの詳細検索を使って返ってきたJSON形式のデータを、キーの中身からデータを指定して表示させたいです。
以下においてtypesのstreet_number、route、locality、administrative_area_level_2、administrative_area_level_1を含む部分のlong_nameをそれぞれ表示させたいです。

{ "result" : { "address_components" : [ { "long_name" : "32", "short_name" : "32", "types" : [ "street_number" ] }, { "long_name" : "The Promenade", "short_name" : "The Promenade", "types" : [ "route" ] }, { "long_name" : "Sydney", "short_name" : "Sydney", "types" : [ "locality", "political" ] }, { "long_name" : "Council of the City of Sydney", "short_name" : "Sydney", "types" : [ "administrative_area_level_2", "political" ] }, { "long_name" : "New South Wales", "short_name" : "NSW", "types" : [ "administrative_area_level_1", "political" ] }, { "long_name" : "オーストラリア", "short_name" : "AU", "types" : [ "country", "political" ] }, { "long_name" : "2000", "short_name" : "2000", "types" : [ "postal_code" ] } ], } }

最初は以下のようにして表示させたのですが、複数のデータを扱う際にstreet_number等の小さい単位のキーがない場合があり、配列の順番の関係で項目ごとに表示できずずれてしまうので、typesの中身で指定したいです。(nilの時はif文などで表示させないようにする予定です)

ruby

1place_detail = detail['result'] 2address = place_detail['address_components'] 3answer = { 4 street_number:address[0]['long_name'], 5 route:address[1]['long_name'], 6 locality:address[2]['long_name'], 7 area_level_2:address[3]['long_name'], 8 area_level_1:address[4]['long_name'] 9}

よろしくお願いします。

追記

ruby

1require 'net/https' 2require 'uri' 3require 'json' 4 5API_KEY = 'Your API Key' 6 7lat = '3.1528496' 8lng = '101.7015546' 9rad = '50000' 10 11# types = 'train_station' 12# types = 'university' 13# types = 'school' 14# types = 'shopping_mall' 15# types = 'hospital' 16types = 'bus_station' 17# types = 'subway_station' 18# types = 'department_store' 19 20 21language = 'en' 22 23uri = URI.parse "https://maps.googleapis.com/maps/api/place/radarsearch/json?location=#{lat},#{lng}&radius=#{rad}&types=#{types}&language=en&key=#{API_KEY}" 24 25request = Net::HTTP::Get.new(uri.request_uri) 26response = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http| 27 http.request(request) 28end 29 30body = JSON.parse response.body 31results = body['results'] 32 33results.each do |result| 34 place_id = result['place_id'] 35 36 uri2 = URI.parse "https://maps.googleapis.com/maps/api/place/details/json?placeid=#{place_id}&language=en&key=#{API_KEY}" 37 38 request = Net::HTTP::Get.new(uri2.request_uri) 39 response = Net::HTTP.start(uri2.host, uri2.port, use_ssl: uri2.scheme == 'https') do |http| 40 http.request(request) 41 end 42 43 detail = JSON.parse response.body 44 place_detail = detail['result'] 45 location = place_detail['geometry']['location'] 46 address = place_detail['address_components'] 47 check_items = ["street_number", "route", "locality", "administrative_area_level_2", "administrative_area_level_1"] 48 place = {} 49 50 answer = { 51 name:place_detail['name'], 52 lat: location['lat'], 53 lng:location['lng'], 54 address:place_detail['formatted_address'], 55 types:place_detail['types'] 56 } 57 address.each do |element| 58 result = element["types"] & check_items 59 next if result.empty? 60 place[result[0]] = element["long_name"] 61 end 62 63 File.open('./place.json', 'a') do |file| 64 file.puts JSON.pretty_generate(answer) 65 end 66end

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

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

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

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

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

guest

回答1

0

ベストアンサー

ruby

1#!/usr/bin/env ruby 2# -*- encoding:utf-8 -*- 3# 4 5require 'json' 6 7detail = JSON.parse DATA.read 8place_detail = detail['result'] 9address = place_detail['address_components'] 10 11check_items = ["street_number", "route", "locality", "administrative_area_level_2", "administrative_area_level_1"] 12answer = {} 13address.each do |element| 14 result = element["types"] & check_items 15 next if result.empty? 16 answer[result[0]] = element["long_name"] 17end 18p answer 19 20__END__ 21{ 22 "result" : { 23 "address_components" : [ 24 { 25 "long_name" : "32", 26 "short_name" : "32", 27 "types" : [ "street_number" ] 28 }, 29 { 30 "long_name" : "The Promenade", 31 "short_name" : "The Promenade", 32 "types" : [ "route" ] 33 }, 34 { 35 "long_name" : "Sydney", 36 "short_name" : "Sydney", 37 "types" : [ "locality", "political" ] 38 }, 39 { 40 "long_name" : "Council of the City of Sydney", 41 "short_name" : "Sydney", 42 "types" : [ "administrative_area_level_2", "political" ] 43 }, 44 { 45 "long_name" : "New South Wales", 46 "short_name" : "NSW", 47 "types" : [ "administrative_area_level_1", "political" ] 48 }, 49 { 50 "long_name" : "オーストラリア", 51 "short_name" : "AU", 52 "types" : [ "country", "political" ] 53 }, 54 { 55 "long_name" : "2000", 56 "short_name" : "2000", 57 "types" : [ "postal_code" ] 58 } 59 ] 60 } 61}

こういうことですか?

detail = JSON.parse DATA.readDATA.readの部分をGoogle Place APIの詳細検索を使って返ってきたデータ(response.body)にしてください。見た目JSONですが、単なるStringのはずです。
要するに、detail変数にJASONからHashに変換しているだけです。

投稿2017/09/08 10:43

編集2017/09/11 03:20
NCC1701

総合スコア1680

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

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

Manamin

2017/09/11 03:10

回答ありがとうございます!そうです!以下のコードでそれらを実行したいのですが、既存のanswerの配列に今回の結果を足して表示するにはどのようにしたらよいでしょうか?
Manamin

2017/09/11 03:17 編集

```ruby require 'net/https' require 'uri' require 'json' API_KEY = 'Your API Key' lat = '3.1528496' lng = '101.7015546' rad = '50000' types = 'bus_station' language = 'en' uri = URI.parse "https://maps.googleapis.com/maps/api/place/radarsearch/json?location=#{lat},#{lng}&radius=#{rad}&types=#{types}&language=en&key=#{API_KEY}" request = Net::HTTP::Get.new(uri.request_uri) response = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http| http.request(request) end body = JSON.parse response.body results = body['results'] results.each do |result| place_id = result['place_id'] uri2 = URI.parse "https://maps.googleapis.com/maps/api/place/details/json?placeid=#{place_id}&language=en&key=#{API_KEY}" request = Net::HTTP::Get.new(uri2.request_uri) response = Net::HTTP.start(uri2.host, uri2.port, use_ssl: uri2.scheme == 'https') do |http| http.request(request) end detail = JSON.parse response.body place_detail = detail['result'] location = place_detail['geometry']['location'] address = place_detail['address_components'] check_items = ["street_number", "route", "locality", "administrative_area_level_2", "administrative_area_level_1"] place = {} address.each do |element| result = element["types"] & check_items next if result.empty? place[result[0]] = element["long_name"] end answer = { name:place_detail['name'], lat: location['lat'], lng:location['lng'], address:place_detail['formatted_address'], types:place_detail['types'], } File.open('./place.json', 'a') do |file| file.puts JSON.pretty_generate(answer) end end ```
NCC1701

2017/09/11 03:21

追記しました。元のコードを変更して所期の結果が得られるか確認してみてください。
Manamin

2017/09/11 04:32

実行した結果、得ることができました。ありがとうございます!追記したので、その結果を元の実行結果に組み合わせる方法を教えていただけるとありがたいです。
Manamin

2017/09/11 06:17

answerの中にplace:place[:locality]のように記述することで解決しました!ありがとうございました!
Manamin

2017/09/11 06:37

訂正:locality:place['locality']でした
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問