noteプログラミング関連2013-11-13C#でHTTP経由でJSONを取得して値を取り出すMSサンプル作ったらボツになったのでここに書くことにします。HTTPで結果をJSONで返すWebサービスがあって、そこにコンソールアプリからアクセスするというものです。C#はほぼ初心者で、特に.NETはAPIがほとんど分かりません。MSDNとか検索で調べた結果をまとめたものです。エントリの最後にコードの最終版を載せています。Studioに慣れてきて、使うのが楽しくなってきました。VS2010以降はいいですね。Webアプリ仕様(仮)こんな感じのアプリを想定しています。リクエストURLhttp://example.com/app/search?type=json&q=パラメータqにURLエンコードしたパラメータを付けると、HTTP経由でJSONが返されます。}]}JSONはネスト(入れ子)になっています。アプリケーション」を選択します。名前は"JsonTest"とします。4.0"に変更します。デバッグモードでメッセージを出力させる*1には、System.Diagnotics.Debugクラスを使用します。Debug.WriteLine("");コマンドライン引数をパラメータにパラメータqには、ブラウザだったらテキストボックスにスペース区切りで入力するように、コマンドライン引数をスペース区切りしたものを指定します。URLエンコードには、System.Web.HttpUtilityクラスのUrlEncodeメソッドを使用します。これを使用するには、参照設定に"System.Web"を追加する必要があります。文字列結合には、String.Joinメソッドを使用します。args));HTTPアクセスHTTP送受信を行うには、System.Net.WebRequestクラスのCreateメソッドとGetResponseメソッドを使用します。System.Net.WebResponseこの例では、リクエストヘッダの設定も行っています。JSON解析(静的)シリアル化*2を使用して、JSONをオブジェクトに変換することができます。ここでは、静的な取得方法を使います。動的(dynamic型)に取得する方法もありますが、よく知らないので、今回は静的だけでやります。これらの機能を使用するには、参照設定に"System.Runtime.Serialization"を追加する必要があります。構造を表す型を定義します。System.Runtime.SerializationのDataContractAttributeクラスの属性"DataContract"と"DataMember"を指定することで、シリアル化可能であることを宣言できます。前述のJSONにあてはめると、こんな感じになります。}}逆シリアル化(デシリアライズ)するには、次のようにします。名前空間を参照してみてください。(ServiceResult)serializer.ReadObject(resStream);resStream.Close();res.Close();完成版ここまでのを合体させて、ちょっとだけブラッシュアップして完成です。しますが、出力:デバッグ窓に結果が出力されます。}}*1:デバッグモードでConsole.WriteLineの結果が見られないのは不便ですね。*2:.NETではこう呼ぶんですね。シリアライゼーション。Javaだと直列化とも。Framework(以降skinnyと表記)のTIPS、第2弾です。(2)プロフィールid:argiusはてなブログをはじめよう!argiusさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。