JSONを整形して保存するC#の実装例

未整形の JSON を整形してファイルに保存しなおす C# プログラムの実装例です。未知の構造の JSON フォーマットを扱うので Newtonsoft の JSON ライブラリ(の JObject )を使用します。

実装環境

  • .NET Core 3.1
  • C# 9.0
  • VisualStudio2019
  • Windows10

実装コード

コンパイルしてショートカットをデスクトップにおいておいてアイコンの上にファイルをD&Dして使う想定です。

// 説明:
// JSONを整形して保存するだけのスクリプト
//
// e.g.
// > JsonFormatter.exe [/F] filePath...
//

using System;
using System.IO;
using Newtonsoft.Json; // 外部ライブラリ
using Newtonsoft.Json.Linq;

namespace Takap.Utility.Json
{
    internal class AppMain
    {
        // 元のファイルを変換結果で上書きするかどうかのフラグ
        // true : 上書きする / false : しない
        private static bool isOverwrite;

        public static void Main(string[] args)
        {
            foreach (var item in args)
            {
                if (Compare.In(item, "/F", "-F")) // 上書きオプション
                {
                    isOverwrite = true;
                }
            }

            foreach (string item in args)
            {
                if (!File.Exists(item))
                {
                    continue;
                }

                // 引数は全部ファイルパスと想定して全部変換をかける
                JsonConverter.Convert(item, getPath(item));
            }
        }

        private static string getPath(string src) => isOverwrite ? src : src + ".json";
    }

    // JSON変換クラス
    public static class JsonConverter
    {
        public static void Convert(string srcPath, string destPath)
        {
            try
            {
                // ライブラリで読み込んで保存するだけ
                JObject jsonObj = JsonConvert.DeserializeObject<JObject>(File.ReadAllText(srcPath));
                string jsonStr = JsonConvert.SerializeObject(jsonObj, Formatting.Indented);
                if (File.Exists(destPath))
                {
                    File.Delete(destPath);
                }
                File.WriteAllText(destPath, jsonStr);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"{ex}");
            }
        }
    }

    // 「比較する」だけを抜き出したクラス
    public static class Compare
    {
        public static bool String(string a, string b)
        {
            return string.Compare(a, b, StringComparison.InvariantCultureIgnoreCase) == 0;
        }

        public static bool In(string a, params string[] items)
        {
            int len = items.Length;
            for (int i = 0; i < len; i++)
            {
                if (String(a, items[i]))
                {
                    return true;
                }
            }
            return false;
        }
    }
}

以上。