C#でJsonを使う

C#Json.NETを使用して、クラスをJsonに変換したり(シリアライズ)、Jsonをクラスに変換したり(デシリアライズ)する方法です。

www.newtonsoft.com

事前準備

Visual StudioでNewtonsoft.Jsonというパッケージをインストールしてください。
パッケージのインストールについては以下を参照してください。
docs.microsoft.com

クラスをJson形式に変換する

まずはクラスをJson形式に変換する(シリアライズ)の方法です。
今回はユーザー情報を格納するUserModelというクラスを作って、そのクラスをJsonに変換します。

画面

以下のようなボタンが2つある画面を作りました。

f:id:nakahara-10yro:20210329091622p:plain

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を使うと楽です。
ソースコード一式は以下に置いていますので良かったら参考にしてください。

github.com