概要
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点です。
- 階層構造のクラス化:
GeneralやWindowプロパティを作り、設定を整理しています。 - 日本語の文字化け防止:
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 オプションの設定を忘れないようにしましょう。これだけで設定ファイルの可読性が格段に向上します。


最近のコメント