火曜日, 6月 23, 2015

コマンドラインでシカゴの気温を調べる(C# で JSON データを読む)

先日 Java での JSON データの読み方を紹介しました。

ここでは C# で JSON データを読む方法を紹介します。

DataContractJsonSerializer を使った方法です。

DataContractJsonSerializer.ReadObject() を使うと JSON データを読み、オブジェクトとして出力してくれます。

オブジェクトへの変換が「宣言」となっているところがいくらか分かりやすいといえるでしょうか。

まず、読み込みたいデータ構造をクラスとして宣言し、DataContract 属性を付加します。JSON データは DataMember 属性を付加します。ネストされているデータはクラスとして宣言しDataContract 属性を付加します。コードを参照してください。#配列データは配列として宣言します。

出来上がったデータクラスを DataContractJsonSerializer のコンストラクタの引数として渡します。

準備が出来たらHttpWebResponse として読んできたデータを、DataContractJsonSerializer.ReadObject() で読み込みます。

と、この手順を踏むとめでたく JSON データが読み込めます。あとは出力するだけ。

ここの気温の表示はデフォルト設定でなんとK(ケルビン)です。ので 273.15 を引いてやります。

#華氏(℉)か摂氏(℃)か迷ったんでしょうか(もめたんですかね)。

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; }
}
}

Qt: 外部プログラムを起動する

  Qt/C++ のアプリは、外部へ直接アクセスできます。これはネットアプリでは不可能な Qt のメリットです。 外部プログラムを起動することもできます。QProcess::startDetached() を使うと独立したプロセスを立ち上げることができます。 この QProces...