C#でJSONを読み込む

こんばんは。きわさです。

C#(Visual C#)でJSONを読み込む方法です。

まず参照設定で、.NET の System.Runtime.Serialization の追加が必要です。
また、下記が必要です。

using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;

では、いきます。

JSON用のclassを定義する

JSONをパースするためにJSON用のclassを作る必要があります。
以前の記事(PHPでリクエスト情報を取得する)で扱ったJSONを例にすると、下記のようなclassが必要になります。

[DataContract]
class RequestJson
{
    [DataMember]
    public string status { get; set; }

    [DataMember]
    public Results results { get; set; }

    [DataContract]
    public class Results
    {
        [DataMember]
        public string uri { get; set; }

        [DataMember]
        public string method { get; set; }

        [DataMember]
        public string time { get; set; }
            
        [DataMember]
        public string query { get; set; }
            
        [DataMember]
        public string accept { get; set; }
            
        [DataMember]
        public string accept_charset { get; set; }
            
        [DataMember]
        public string accept_encoding { get; set; }
           
        [DataMember]
        public string sccept_language { get; set; }
            
        [DataMember]
        public string connection { get; set; }
           
        [DataMember]
        public string host { get; set; }
            
        [DataMember]
        public string referer { get; set; }
            
        [DataMember]
        public string user_agent { get; set; }
            
        [DataMember]
        public string remote_address { get; set; }
    }
}

このJSONには status と results のメンバがいます。
status は文字列なので、stringで定義します。
このとき普通のclassと違うのは、メンバ定義の直前に [DataMember] を記載するということです。

そして一方、results にはさらに複数のメンバがいます。なので、型は別途定義したResults クラスとします。class定義の直前には [DataContract] を記載します。
なので、Results クラス定義の前と、全体を含む RequestJson クラス定義の前にも記載します。
こうして全てのメンバを記載します。

文字列をJSONオブジェクトにパースする

パースする処理です。

static RequestJson getJson(string text)
{
    RequestJson json;
    // シリアライザ
    var serializer = new DataContractJsonSerializer(typeof(RequestJson));
    using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(text)))
    {
        // JSONデシリアライズ
        json = (RequestJson)serializer.ReadObject(ms);
    }
    return json;
}

json用のclassを渡してシリアライザのオブジェクトを生成します。
そして文字列をストリームに読み込み、さらにシリアライザで読み込みます。
これでパースは完了で、jsonオブジェクトが取得できます。

あとは json.status や json.results.uri というように各メンバにアクセスできます。

スポンサーリンク