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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

986閲覧

簡易逆ジオコーディングサービスを利用して緯度・経度から、住所を取得したい

nagi2011

総合スコア17

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2019/04/02 13:52

編集2019/04/02 13:53

簡易逆ジオコーディングサービスを利用して、
緯度・経度から、住所を取得しようとしています。
以下のコードで、市町村までは取得できるのですが、
「local」配下の「section」が取得できません。
どのように取得できるのでしょうか。
(localは配列になっています。)

c#

1 // 結果JSONのデシリアライズ 2 var desirializedData = (Dictionary<string, object>)Json.Deserialize(www.text); 3 4 // 成功した場合のみ処理 5 if ((long)desirializedData["status"] == 200) 6 { 7 // 都道府県+市区町村を文字列として保持 8 var result = (Dictionary<string, object>)desirializedData["result"]; 9 var prefecture = (Dictionary<string, object>)result["prefecture"]; 10 var municipality = (Dictionary<string, object>)result["municipality"]; 11 var local = (Dictionary<string, object>)result["local"]; 12 //Address = (string)prefecture["pname"] + " " + (string)municipality["mname"]; 13 Address = (string)prefecture["pname"] + " " + (string)municipality["mname"] + " " + (string)local["section"] ; 14 } 15

戻り値のサンプルは以下の通りです。
※実際に使用しているのJSON版なのですが、文字化けしてしまうので、xml版を貼り付けました。

xml

1<?xml version="1.0" encoding="UTF-8"?> 2<rgeocode xmlns="http://finds.jp/ts" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 3 <status>200</status> 4 <result> 5 <prefecture> 6 <pcode>34</pcode> 7 <pname>広島県</pname> 8 </prefecture> 9 <municipality> 10 <mname>福山市</mname> 11 <mcode>34207</mcode> 12 </municipality> 13 <local> 14 <section>西深津町六丁目</section> 15 <homenumber>12</homenumber> 16 <distance>69.707053182466</distance> 17 <latitude>34.501616</latitude> 18 <longitude>133.384224</longitude> 19 </local> 20 </result> 21 <argument> 22 <latitude>34.5012296</latitude> 23 <longitude>133.384822</longitude> 24 <localradius>500</localradius> 25 <localmax>1</localmax> 26 </argument> 27 <meta name="thanks" content="このサービスは 国土交通省 提供 国土数値情報(行政区域) を利用しています" /> 28 <meta name="thanks" content="このサービスは 国土交通省 提供 街区レベル位置参照情報および大字・町丁目レベル位置参照情報 を利用しています" /> 29</rgeocode>``` 30 31 32【環境】 33unity(c#)

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

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

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

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

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

sakura_hana

2019/04/03 02:16

「取得できません」とのことですが、具体的にはどういうことでしょうか?(エラーが出る、nullになる、空文字になる等。エラーが出る場合はエラーメッセージを質問に追記お願いします) また、小数点付きの数字か要素の個数が怪しいと思うのですが、distance,latitude,longitudeを削ったJSONを渡した場合はどうなりますか?(www.textの代わりに自作した文字列を渡してみてください)
退会済みユーザー

退会済みユーザー

2019/04/03 02:24

簡易逆ジオコーディングサービスというのはこれ https://www.finds.jp/rgeocode/index.html.ja のことですか? このページの「実行例」のセクションの「近畿中国四国農業研究センター」の JSON をクリックすると応答として返ってくる JSON 文字列を C# のオブジェクトにデシリアライズして「local」配下の「section」が文字列として取得できればいいのですか?
退会済みユーザー

退会済みユーザー

2019/04/03 02:41

よく見てみれば Unity の話で、デシリアライズするのに MiniJSON というライブラリを使っているようですね。それの使用は必須で、C# では一般的に使われている JavaScriptSerializer とか Json.NET は使わないという条件ですか?
guest

回答1

0

ベストアンサー

「local」配下の「section」が取得できません。どのように取得できるのでしょうか。

質問に対するコメントに書きましたが、簡易逆ジオコーディングサービスというのは

https://www.finds.jp/rgeocode/index.html.ja

のことで、このページの「実行例」のセクションの「近畿中国四国農業研究センター」の JSON をクリックすると応答として返ってくる JSON 文字列を、MiniJSON ライブラリを使って、C# のオブジェクトにデシリアライズして「local」配下の「section」を文字列として取得できればいいと理解してレスします。

質問者さんの開発環境で Visual Studio のデバッガが使えるかどうかわかりませんが、使えれば下の画像のように適当な場所にブレークポイントを置いてデシリアライズした結果の Dictionary<string, object> オブジェクト(質問者さんの場合は desirializedData)の構造を見てください。

イメージ説明

構造が分かれば目的の項目をどのように取得できるか分かると思います。上の画像には「local」配下の「section」を文字列として取得するコードもありますので見てください。

【追伸】

質問に対するコメントで、

C# では一般的に使われている JavaScriptSerializer とか Json.NET は使わないという条件ですか?

と書きましたが、Json.NET ライブラリを使った方法を紹介しておきます。自分的にはこちらがお勧めです。

問題はデシリアライズされる C# のクラス定義ですが、それは以下のようなサービスを利用すれば簡単です。

json2csharp
http://json2csharp.com/

簡易逆ジオコーディングサービス https://www.finds.jp/rgeocode/index.html.ja のページの「実行例」のセクションの「近畿中国四国農業研究センター」の JSON をクリックすると応答として返ってくる JSON 文字列を上記 json2csharp を利用して C# のクラス定義を取得すると以下の通りとなります。

public class Prefecture { public int pcode { get; set; } public string pname { get; set; } } public class Municipality { public string mname { get; set; } public int mcode { get; set; } } public class Local { public string section { get; set; } public string homenumber { get; set; } public double distance { get; set; } public double latitude { get; set; } public double longitude { get; set; } } public class Result { public Prefecture prefecture { get; set; } public Municipality municipality { get; set; } public List<Local> local { get; set; } } public class Argument { public double latitude { get; set; } public double longitude { get; set; } public int localradius { get; set; } public int localmax { get; set; } } public class Meta { public string name { get; set; } public string content { get; set; } } public class RootObject { public int status { get; set; } public Result result { get; set; } public Argument argument { get; set; } public List<Meta> meta { get; set; } }

上記が得られれば、Json.NET ライブラリを使って以下のコードで同じ結果が得られます。

RootObject rootObject = JsonConvert.DeserializeObject<RootObject>(jsonText); foreach (Local local in rootObject.result.local) { Console.WriteLine(local.section); }

MiniJSON でのデシリアライズの結果の Dictionary<string, object> の入れ子のオブジェクトの構造に頭を悩ますより、こちらの方がはるかに分かりやすいはずです。

投稿2019/04/03 07:31

編集2019/04/03 10:22
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

nagi2011

2019/04/03 13:10

ありがとうございました! 頂いたソースでうまくいきました!
退会済みユーザー

退会済みユーザー

2019/04/03 13:14

結局 MiniJSON を使ったのでしょうか? Unity ではそうせざるを得なかった? そのあたりを書いていただけると幸いです。
nagi2011

2019/04/03 13:16

JsonConvert.DeserializeObjectを利用させて頂きました。 やはり、dtoへの自動マッピングではないと可読性も低いですし。
nagi2011

2019/04/03 13:19

ちなみに、他のAPIして取得処理については、以下のように取得していました。 T ret = JsonConvert.DeserializeObject<T>(response.ToString(Formatting.None, new JavaScriptDateTimeConverter())); 今回、MiniJSONを使っていたのは、サンプルソースがそうだったからというだけでした。 Tは、戻り値のDTOのクラスをジュネリックで、 JavaScriptDateTimeConverterを引数にいれているのは、日時取得の際にバグってしまうので入れました。
退会済みユーザー

退会済みユーザー

2019/04/03 13:21

返答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問