C#でJson.NETを使用して、クラスをJsonに変換したり(シリアライズ)、Jsonをクラスに変換したり(デシリアライズ)する方法です。
事前準備
Visual StudioでNewtonsoft.Jsonというパッケージをインストールしてください。
パッケージのインストールについては以下を参照してください。
docs.microsoft.com
クラスをJson形式に変換する
まずはクラスをJson形式に変換する(シリアライズ)の方法です。
今回はユーザー情報を格納するUserModelというクラスを作って、そのクラスをJsonに変換します。
画面
以下のようなボタンが2つある画面を作りました。
UserModel
シリアライズ、デシリアライズ対象のUserModelです。
Jsonに含めたくないプロパティには以下のアノテーションを付与しておきます。
[Newtonsoft.Json.JsonIgnore]
using System; using System.Collections.Generic; using System.Text; namespace WpfJsonConverterSample { /// <summary> /// User Model /// </summary> public class UserModel { /// <summary> /// CreatedDateTime /// </summary> [Newtonsoft.Json.JsonIgnore] public DateTime CreatedDateTime { get; set; } /// <summary> /// User Id /// </summary> public int UserId { get; set; } /// <summary> /// User Name /// </summary> public string UserName { get; set; } /// <summary> /// Birth Day /// </summary> public DateTime BirthDay { get; set; } /// <summary> /// Family /// </summary> public List<UserModel> Family { get; set; } = new List<UserModel>(); /// <summary> /// FamilyCount /// </summary> [Newtonsoft.Json.JsonIgnore] public int FamilyCount { get { return this.Family.Count; } } } }
クラスをJsonに変換する(シリアライズ)
// 出力ファイルパス private const string FilePath = @"c:\temp\user.json"; /// <summary> /// Serialize /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void BtnSerialize_Click(object sender, RoutedEventArgs e) { // UserModelを生成 var user = this.CreateUserModel(); // 生成したUserModelをJsonに変換し、ファイルに出力する var json = Newtonsoft.Json.JsonConvert.SerializeObject(user); using (var sw = new StreamWriter(FilePath, false, Encoding.UTF8)) { sw.Write(json); } } /// <summary> /// CreateUserModel /// </summary> /// <returns></returns> private UserModel CreateUserModel() { var tanaka = new UserModel(); tanaka.CreatedDateTime = DateTime.Now; tanaka.UserId = 1; tanaka.UserName = "田中 太郎"; tanaka.BirthDay = new DateTime(1990, 12, 23); var mama = new UserModel(); mama.CreatedDateTime = DateTime.Now; mama.UserId = 2; mama.UserName = "田中 花子"; mama.BirthDay = new DateTime(1991, 3, 4); tanaka.Family.Add(mama); var child = new UserModel(); child.CreatedDateTime = DateTime.Now; child.UserId = 3; child.UserName = "田中 一郎"; child.BirthDay = new DateTime(2018, 11, 1); tanaka.Family.Add(child); return tanaka; }
出力されたJsonは以下です。
{ "UserId": 1, "UserName": "田中 太郎", "BirthDay": "1990-12-23T00:00:00", "Family": [ { "UserId": 2, "UserName": "田中 花子", "BirthDay": "1991-03-04T00:00:00", "Family": [] }, { "UserId": 3, "UserName": "田中 一郎", "BirthDay": "2018-11-01T00:00:00", "Family": [] } ] }
以下のメソッドでクラスがJsonに変換されます。かんたんですね。
Newtonsoft.Json.JsonConvert.SerializeObject(user);
今回はJson(string変数)をファイルに出力しています。
データベースを利用したアプリケーションであれば、この文字列をDBに保存しておきます。
Jsonをクラスに変換する(デシリアライズ)
逆にJsonからUserModelを生成します。(デシリアライズ)
/// <summary> /// Deserialize /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void BtnDeserialize_Click(object sender, RoutedEventArgs e) { var json = File.ReadAllText(FilePath); var userModel = Newtonsoft.Json.JsonConvert.DeserializeObject<UserModel>(json); var result = Newtonsoft.Json.JsonConvert.SerializeObject(json); Debug.WriteLine(result); }
ファイルの内容をすべて読み込み、読み込んだ内容を以下のメソッドに渡しています。
今回はGenericsメソッドを使って変換したいクラスを指定しておきます。
Newtonsoft.Json.JsonConvert.DeserializeObject<UserModel>(json);
まとめ
C#でクラスからJsonへの変換、Jsonからクラスへの変換はJson.NETを使うと楽です。
ソースコード一式は以下に置いていますので良かったら参考にしてください。