본문 바로가기
C#

[C#] System.Text.Json.JsonSerializer.Serialize 할 때 한글이 유니코드 형식으로 출력 될 때

by Jcoder 2022. 2. 11.
internal class Program
{
    static void Main(string[] args)
    {
        TextEncoderSettings encoderSettings = new();
        encoderSettings.AllowRange(UnicodeRanges.All);

        JsonSerializerOptions settings = new()
        {
            WriteIndented = true,
            //Encoder = System.Text.Encodings.Web.JavaScriptEncoder.Create(encoderSettings),
            AllowTrailingCommas = true
        };

        if (args.Length == 0)
        {
            Console.WriteLine($"{nameof(args)}가 비어있습니다. 파일 경로를 입력하세요.");
            return;
        }
        else if (args.Length ==1)
        {
            Console.WriteLine(args[0]);
            string argement = args[0];
            if (string.IsNullOrEmpty(argement))
            {
                Console.WriteLine($"{nameof(argement)}가 비어있습니다. 디렉토리 또는 파일 경로를 입력하세요.");
                return;
            }
            var getFullPath = System.IO.Path.GetFullPath(argement);
            System.IO.FileInfo fileInfo = new System.IO.FileInfo(getFullPath);
            var fileAttribute = fileInfo.Attributes;

            Console.WriteLine(getFullPath);
            if (fileAttribute is System.IO.FileAttributes.Directory)
            {
                var fileList = System.IO.Directory.GetFiles(getFullPath, "*", System.IO.SearchOption.TopDirectoryOnly);

                var file = GetFileVersionInfos(fileList);
                if (file != null)
                {
                    Console.WriteLine(System.Text.Json.JsonSerializer.Serialize<object>(new { count = file.Length, fileList = file }, settings).ToString());
                }    
            }
            else if (fileAttribute is System.IO.FileAttributes.Normal)
            {
                if (fileInfo.Exists)
                {
                    if (fileInfo.Extension.Contains("zip", StringComparison.OrdinalIgnoreCase))
                    {
                        using var entries = System.IO.Compression.ZipFile.OpenRead(fileInfo.FullName);

                        var file = GetFileVersionInfos(entries.Entries);
                        if (file != null)
                        {
                            Console.WriteLine(System.Text.Json.JsonSerializer.Serialize<object>(new { count = file.Length, fileList = file }, settings).ToString());
                        }
                    }
                }
                else
                    Console.WriteLine($"{fileInfo.FullName}이 없습니다.");
                
            }
        }

        //Console.Read();
    }

    private static FileVersionInfo[] GetFileVersionInfos(string[] fileArray)
    {
        if (fileArray == null || !fileArray.Any())
            return null;

        return (from file in fileArray
                let fileVersionInfo = new FileVersionInfo() 
                { 
                    FullName = file, 
                    Extension = System.IO.Path.GetExtension(file).Remove(0, 1), 
                    LastWriteTime = System.IO.File.GetLastWriteTime(file) 
                }
                select fileVersionInfo).ToArray();
    }

    private static FileVersionInfo[] GetFileVersionInfos(ReadOnlyCollection<ZipArchiveEntry> zipArchiveEntries)
    {
        if (zipArchiveEntries == null || !zipArchiveEntries.Any())
            return null;

        return (from file in zipArchiveEntries
                let fileVersionInfo = new FileVersionInfo() 
                { 
                    FullName = file.FullName, 
                    Extension = System.IO.Path.GetExtension(file.FullName).Remove(0, 1), 
                    LastWriteTime = file.LastWriteTime.DateTime 
                }
                select fileVersionInfo).ToArray();
    }

    struct FileVersionInfo
    {
        [System.Text.Json.Serialization.JsonInclude()]
        public string FullName { get; set; }
        public string Extension { get; set; }
        public DateTime LastWriteTime { get; set; }
        public override string ToString() => $"{FullName}, {LastWriteTime}";
    }
}

윈도우에서 한글이 포함된 절대 경로를 Json Serializer 하고 출력을 할 때 아래처럼 유니코드가 포함돼서 나왔습니다.

{
  "count": 2,
  "fileList": [
    {
      "FullName": "C:\\Users\\tjdsk\\Desktop\\2022\uD55C\uAE00\\test1.txt",
      "Extension": "txt",
      "LastWriteTime": "2022-02-11T13:55:24.3117131+09:00"
    },
    {
      "FullName": "C:\\Users\\tjdsk\\Desktop\\2022\uD55C\uAE00\\\uD14C\uC2A4\uD2B81.txt",
      "Extension": "txt",
      "LastWriteTime": "2022-02-11T13:55:29.7588527+09:00"
    }
  ]
}

위에 유니코드 말고 한글로 출력하고 싶으시면 아래 주석을 해제 하면 됩니다.

// 아래 encoderSettings 에 UnicodeRanges.All을 추가하고 JsonSerializerOptions 에 Encoder를 추가합니다.
TextEncoderSettings encoderSettings = new();
encoderSettings.AllowRange(UnicodeRanges.All);

JsonSerializerOptions settings = new()
{
        WriteIndented = true,
        //Encoder = System.Text.Encodings.Web.JavaScriptEncoder.Create(encoderSettings), // <-
        AllowTrailingCommas = true
};
{
  "count": 2,
  "fileList": [
    {
      "FullName": "C:\\Users\\tjdsk\\Desktop\\2022한글\\test1.txt",
      "Extension": "txt",
      "LastWriteTime": "2022-02-11T13:55:24.3117131+09:00"
    },
    {
      "FullName": "C:\\Users\\tjdsk\\Desktop\\2022한글\\테스트1.txt",
      "Extension": "txt",
      "LastWriteTime": "2022-02-11T13:55:29.7588527+09:00"
    }
  ]
}

그러면 아래처럼 한글이 포함되어서 출력이 됩니다.