🗃️ INIファイルをから JSON へ移行する [C#]

C#

概要

WindowsフォームやWPFなどでツールを作成する際、設定ファイルの保存形式として長らく親しまれてきた .ini ファイル。しかし、階層構造を持つデータや型(数値、ブール値など)をより自然に扱うため、現代の開発では JSON 形式への移行が推奨されています。

今回は、C# (.NET) の標準ライブラリ System.Text.Json を使い、従来の INI ファイルのイメージをそのまま JSON に置き換え、読み書きするサンプルコードを紹介します。

1. INIファイルと JSONファイルの比較

これまで .ini ファイルで管理していた「セクション」分けされた設定は、JSONの「階層構造(オブジェクト)」として表現すると非常にすっきりします。

以前の形式 (.ini)

セクション([General]など)で区切られていますが、構造はフラットに近い形です。

INI
[General]
AppName="My App"
UserName="はがラボ"
MaxItems=20
EnableLog=false
LastRunDate="2025-12-16T23:15:35.6216095+09:00"

[Window]
Title="Haga Lab"
Width=1024
Height=768
IsDarkMode=true

新しい形式 (.json)

セクションがそのままネストされたオブジェクトになり、文字列だけでなく数値やブール値 (true/false) も型として扱えます。

JSON
{
  "General": {
    "AppName": "My App",
    "UserName": "はがラボ",
    "MaxItems": 20,
    "EnableLog": false,
    "LastRunDate": "2025-12-17T08:57:46.4760135+09:00"
  },
  "Window": {
    "Title": "Haga lab",
    "Width": 1024,
    "Height": 768,
    "IsDarkMode": true
  }
}

2. 実装コード (C#)

設定データを保持するクラスと、読み書きを行うマネージャークラスの実装例です。

設定クラスと管理クラス (AppSettings.cs)

ポイントは以下の2点です。

  1. 階層構造のクラス化: GeneralWindow プロパティを作り、設定を整理しています。
  2. 日本語の文字化け防止: JavaScriptEncoder.Create(UnicodeRanges.All) を指定することで、JSONファイル内の日本語が \u3042 のようにエスケープされず、そのまま読み書きできるようにしています。
C#
using System;
using System.IO;
using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.Unicode;

namespace JsonConfigSample
{
    // 1. 設定データを保持するクラス (データモデル)
    public class AppSettings
    {
        // 階層構造を持たせるため、各設定クラスをプロパティとして持つ
        public GeneralSettings General { get; set; } = new GeneralSettings();
        public WindowSettings Window { get; set; } = new WindowSettings();
    }

    // 1.1 Generalセクションの設定クラス
    public class GeneralSettings
    {
        public string AppName { get; set; } = "Default App";
        public string UserName { get; set; } = "ゲストユーザー";
        public int MaxItems { get; set; } = 5;
        public bool EnableLog { get; set; } = false;
        public DateTime LastRunDate { get; set; } = DateTime.Now;
    }

    // 1.2 Windowセクションの設定クラス
    public class WindowSettings
    {
        public string Title { get; set; } = "Haga Lab Tool";
        public int Width { get; set; } = 800;
        public int Height { get; set; } = 600;
        public bool IsDarkMode { get; set; } = false;
    }

    // 2. 読み書きを担当する管理クラス
    public static class ConfigManager
    {
        // 保存するファイル名
        private static readonly string FilePath = "appsettings.json";

        // JSONの設定(日本語をそのまま読みやすく保存するために重要)
        private static readonly JsonSerializerOptions Options = new JsonSerializerOptions
        {
            WriteIndented = true, // 整形して保存(改行・インデントを入れる)
            // 日本語などの非ASCII文字をエスケープ(\uXXXX)しない設定
            Encoder = JavaScriptEncoder.Create(UnicodeRanges.All)
        };

        /// <summary>
        /// 設定を読み込みます。ファイルがない場合はデフォルト値を返します。
        /// </summary>
        public static AppSettings Load()
        {
            if (!File.Exists(FilePath))
            {
                // 初回起動時などファイルがない場合はデフォルト設定を返す
                return new AppSettings();
            }

            try
            {
                string jsonString = File.ReadAllText(FilePath);
                var settings = JsonSerializer.Deserialize<AppSettings>(jsonString, Options);
                return settings ?? new AppSettings();
            }
            catch (Exception)
            {
                // 読み込みエラー時は安全策としてデフォルト値を返す
                return new AppSettings();
            }
        }

        /// <summary>
        /// 設定を保存します。
        /// </summary>
        public static void Save(AppSettings settings)
        {
            try
            {
                // 保存時に最終実行日時などを更新するならここで行う
                settings.General.LastRunDate = DateTime.Now;

                string jsonString = JsonSerializer.Serialize(settings, Options);
                File.WriteAllText(FilePath, jsonString);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"保存エラー: {ex.Message}");
            }
        }
    }
}

利用例 (Program.cs)

アプリケーションの起動時に Load し、終了時などに Save するだけで設定が永続化されます。

C#
using System;

namespace JsonConfigSample
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("--- アプリケーション開始 ---");

            // A. 起動時に設定をロード
            AppSettings currentSettings = ConfigManager.Load();

            // 読み込んだ設定を表示
            Console.WriteLine($"[現在の設定]");
            Console.WriteLine($"AppName: {currentSettings.General.AppName}");
            Console.WriteLine($"Title:   {currentSettings.Window.Title}");
            Console.WriteLine($"Width:   {currentSettings.Window.Width}");

            Console.WriteLine("\n... 設定を変更します ...\n");

            // B. アプリケーション内で設定値を変更
            currentSettings.General.AppName = "My App2";
            currentSettings.General.UserName = "はがラボ"; // 日本語もOK
            currentSettings.Window.IsDarkMode = true;

            // C. 終了時などに設定をセーブ
            ConfigManager.Save(currentSettings);

            Console.WriteLine("--- 設定を保存して終了しました ---");
        }
    }
}

☝️まとめ

INIファイルからJSONへ移行することで、より複雑なデータ構造にも対応でき、モダンな開発環境との親和性も高まります。

特に System.Text.Json を使う場合、日本語環境では Encoder オプションの設定を忘れないようにしましょう。これだけで設定ファイルの可読性が格段に向上します。