ここでは C# で JSON データを読む方法を紹介します。
DataContractJsonSerializer を使った方法です。
DataContractJsonSerializer.ReadObject() を使うと JSON データを読み、オブジェクトとして出力してくれます。
オブジェクトへの変換が「宣言」となっているところがいくらか分かりやすいといえるでしょうか。
まず、読み込みたいデータ構造をクラスとして宣言し、DataContract 属性を付加します。JSON データは DataMember 属性を付加します。ネストされているデータはクラスとして宣言しDataContract 属性を付加します。コードを参照してください。#配列データは配列として宣言します。
出来上がったデータクラスを DataContractJsonSerializer のコンストラクタの引数として渡します。
準備が出来たらHttpWebResponse として読んできたデータを、DataContractJsonSerializer.ReadObject() で読み込みます。
と、この手順を踏むとめでたく JSON データが読み込めます。あとは出力するだけ。
ここの気温の表示はデフォルト設定でなんとK(ケルビン)です。ので 273.15 を引いてやります。
#華氏(℉)か摂氏(℃)か迷ったんでしょうか(もめたんですかね)。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
using System.IO; | |
using System.Linq; | |
using System.Runtime.Serialization; | |
using System.Runtime.Serialization.Json; | |
using System.Text; | |
using System.Threading.Tasks; | |
using System.Net; | |
namespace JSONTest | |
{ | |
class Program | |
{ | |
static void Main(string[] args) | |
{ | |
try | |
{ | |
String url = "http://api.openweathermap.org/data/2.5/weather?q=chicago"; | |
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; | |
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) | |
{ | |
if (response.StatusCode != HttpStatusCode.OK) | |
throw new Exception(String.Format( | |
"Server error (HTTP {0}: {1}).", | |
response.StatusCode, | |
response.StatusDescription)); | |
DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(Response)); | |
object objResponse = jsonSerializer.ReadObject(response.GetResponseStream()); | |
Response jsonResponse = objResponse as Response; | |
//Console.WriteLine(jsonResponse.main.temp - 273.15); | |
jsonSerializer.WriteObject(Console.OpenStandardOutput(), jsonResponse); | |
Console.ReadLine(); | |
} | |
} | |
catch (Exception e) | |
{ | |
Console.Error.WriteLine(e.ToString()); | |
//throw e; | |
Console.ReadLine(); | |
} | |
} | |
} | |
[DataContract] | |
public class Response | |
{ | |
[DataMember(Name = "main")] | |
public Main main { get; set; } | |
[DataMember(Name = "coord")] | |
public Coord coord { get; set; } | |
[DataMember(Name = "sys")] | |
public Sys sys { get; set; } | |
[DataMember(Name = "weather")] | |
public Weather[] weather { get; set; } | |
[DataMember(Name = "wind")] | |
public Wind wind { get; set; } | |
[DataContract] | |
public class Coord | |
{ | |
[DataMember(Name = "lon")] | |
public double lon { get; set; } | |
[DataMember(Name = "lat")] | |
public double lat { get; set; } | |
} | |
[DataContract] | |
public class Sys | |
{ | |
[DataMember(Name = "message")] | |
public double message { get; set; } | |
[DataMember(Name = "country")] | |
public string country { get; set; } | |
[DataMember(Name = "sunrise")] | |
public long sunrise { get; set; } | |
[DataMember(Name = "sunset")] | |
public long sunset { get; set; } | |
} | |
[DataContract] | |
public class Weather | |
{ | |
[DataMember(Name = "id")] | |
public long id { get; set; } | |
[DataMember(Name = "main")] | |
public string main { get; set; } | |
[DataMember(Name = "description")] | |
public string description { get; set; } | |
[DataMember(Name = "icon")] | |
public string icon { get; set; } | |
} | |
[DataMember(Name = "base")] | |
public string _base { get; set; } | |
[DataContract] | |
public class Main | |
{ | |
[DataMember(Name = "temp")] | |
public double temp { get; set; } | |
[DataMember(Name = "temp_min")] | |
public double temp_min { get; set; } | |
[DataMember(Name = "temp_max")] | |
public double temp_max { get; set; } | |
[DataMember(Name = "pressure")] | |
public double pressure { get; set; } | |
[DataMember(Name = "sea_level")] | |
public double sea_level { get; set; } | |
[DataMember(Name = "grnd_level")] | |
public double grnd_level { get; set; } | |
[DataMember(Name = "humidity")] | |
public long humidity { get; set; } | |
} | |
[DataContract] | |
public class Wind | |
{ | |
[DataMember(Name = "speed")] | |
public double speed { get; set; } | |
[DataMember(Name = "deg")] | |
public double deg { get; set; } | |
} | |
[DataContract] | |
public class Clouds | |
{ | |
[DataMember(Name = "all")] | |
public long all { get; set; } | |
} | |
[DataMember(Name = "dt")] | |
public long dt { get; set; } | |
[DataMember(Name = "id")] | |
public long id { get; set; } | |
[DataMember(Name = "name")] | |
public string name { get; set; } | |
[DataMember(Name = "cod")] | |
public long cod { get; set; } | |
} | |
} |