前回は AssetsフォルダにあるJSONファイルを読み込む方法について紹介しました。
今回は読み込んだJSON形式の文字列をデシリアライズする方法について説明します。
使用するJSONファイルの例は、前回の記事を参照してください。
はじめにデシリアライズ用のクラス(読み込んだJSON文字列のデータを格納するためのクラス)を準備します。
取り込むJSONファイルは、県名、県が持つ市の名前、県のIDです。
よって以下のような2つのクラスを作成しました。これにより1つの県に対し市町村名を複数持てるようにしています。Prefectureクラスが県と市町村を管理するクラスで、Cityクラスが市町村を管理するクラスです。
シリアライズ/デシリアライズするには、クラス名の属性として[DataContract]を、メンバーの属性には[DataMember]が必要です。
// Cityクラス // 県が持つ市町村名とそのIDを管理するクラス。 [DataContract] class City { [DataMember] public string Id { get; set; } [DataMember] public string Name { get; set; } }
// Prefectureクラス // 県の名前(Name)とCityクラスのデータをListで管理するクラス [DataContract] class Prefecture { [DataMember] public string Name { get; set; } [DataMember] public List<City> Cities { get; set; } }
さて、クラスが準備できましたので後はデシリアライズするコードを記述します。
// jsonデータからクラスへのデシリアライズ
List<Prefecture> pref;
using (var stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(json)))
{
// List<Prefecture>に変換できるシリアライザーを作成
var serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(List<Prefecture>));
// クラスにデータを読み込む
pref = serializer.ReadObject(stream) as List<Prefecture>;
}2行目でデシリアライズ先のクラスを準備し、3行目でjson文字列をstreamに読み込みます。
6行目はシリアライザーの作成処理です。この処理には、DataContractJsonSerializerクラスを使用します。引数にはシリアライズ先のデータ型を指定します。この例ですとList<Prefecture>となります。
7行目が実際のデシリアライズ処理です。6行目で作成したシリアライザーがも津ReadObjectメソッドでデータを読み取ります。as List<Prefecture>とすることで読み込んだデータの型を決定し、変数prefへと代入しています。
以上で変数prefには、JSONから読み込んだデータが格納されます。
たった数行でデシリアライズできるので、今後使いどころが増えそうです。
次回はシリアライズについて見ていきます。
関連記事
[UWP] AssetsフォルダからJSONファイルを読み込む
コメント