김김김의 게임개발
  • C# #26 JSON
    2023년 09월 01일 19시 32분 13초에 업로드 된 글입니다.
    작성자: noun06

    What

    • JSON(JavaScript Object Notation)은 데이터 교환과 저장을 위한 경량의 데이터 형식임. 주로 텍스트 형식으로 표현되며 데이터를 구조화하고 표현하는데 사용됨.

    When

    • 데이터 교환: C# 어플리케이션과 다른 시스템 혹은 서비스 간 데이터 교환에 사용됨. 웹 API와의 인터렉션, 외부 서비스와 통신, 데이터베이스와의 데이터 교환 등의 경우에 JSON이 사용됨.
    • 구성 정보 저장: 웹 어플리케이션의 설정 정보, 데이터베이스 연결 문자열, 어플리케이션 동작 설정 등을 JSON 파일로 저장하여 관리할 수 있음.
    • 서버-클라이언트 통신: C# 웹 앱에서 클라이언트와 서버 간에 데이터를 주고받을 때, 클라이언트 측에서 JSON을 사용하여 데이터를 요청하고 서버에서 JSON 형식으로 응답함.

    Why

    • 가독성과 간결성: 텍스트 기반으로 작성되며 데이터가 키-값 쌍 형식으로 구성되어 데이터가 어떻게 구조화되었는지 명확하게 파악할 수 있음. 
    • 플랫폼 독립성:JSON은 어떤 프로그래밍 언어나 플랫폼에서도 사용할 수 있는 형식으로 서로 다른 시스템 간 데이터를 교환할 때 사용할 수 있음.
    • 유연성: JSON은 중첩된 구조를 가질 수 있으며 사용자 정의 데이터 형식을 정의하고 확장할 수 있는 유연성을 제공함.

    How

    • 데이터의 구조 정의: 데이터를 JSON으로 표현하기 위해 데이터 구조를 정의함. JSON은 키-값 쌍으로 구성되어 중괄호 { }로 객체를 대괄호[ ]로 배열을 나타냄.
    public class AppSettings
    {
        public string ApiKey { get; set; }
        public string DatabaseConnection { get; set; }
    }

     

    • 직렬화(Serialization): 개체나 데이터 구조를 JSON 문자열로 변환하는 과정. System.Text.Json 또는 Newtonsoft.Json 등의 JSON 라이브러리를 활용.
    using Newtonsoft.Json;
    using System.IO;
    
    // 설정 정보를 객체로 생성
    var settings = new AppSettings
    {
        ApiKey = "my_api_key",
        DatabaseConnection = "my_database_connection_string"
    };
    
    // JSON으로 직렬화하고 파일에 저장
    string json = JsonConvert.SerializeObject(settings);
    File.WriteAllText("appsettings.json", json);

     

    • 역직렬화(Deserialization): JSON 문자열을 다시 C# 개체나 데이터 구조로 변환하는 과정. 직렬화된 JSON문자열을 역직렬화하여 사용. 
    using Newtonsoft.Json;
    
    // JSON 파일에서 데이터 읽어오기
    string json = File.ReadAllText("appsettings.json");
    
    // JSON을 역직렬화하여 설정 정보 객체로 변환
    AppSettings settings = JsonConvert.DeserializeObject<AppSettings>(json);
    
    // 설정 정보 사용
    Console.WriteLine($"API Key: {settings.ApiKey}");
    Console.WriteLine($"Database Connection: {settings.DatabaseConnection}");

     

    코드 분석

    C# 팀과제에서 사용된 JsonUtility 클래스의 주요 구성 요소와 작동 방식 분석을 진행함. 이 클래스를 통해 JSON 데이터를 파일로 저장하고 로드하는 작업을 간편하게 처리할 수 있으며 게임의 설정, 데이터, 사용자 프로필 등을 저장하고 관리할 수 있었음.

     

    using System.Text.Json;
    public class JsonUtility
    {
        // 경로를 저장할 기본 경로
        static readonly string basePath = Directory.GetParent(Environment.CurrentDirectory).FullName;
    • System.Text.Json 네임스페이스는 JSON 직렬화 및 역직렬화를 위한 클래스들을 포함하고 있음.
    • JsonUtility 클래스는 JSON 데이터를 저장하고 로드하는 메서드를 제공함. 클래스 내 basePath라는 문자열을 정의하여 JSON 파일이 저장될 기본 경로를 설정함. 기본 경로는 현재의 상위 디렉토리로 세팅.

     

    public static void Save<T>(T t, string name) where T : class
    {
        string filePath = @$"{basePath}\{name}.json";
        
        string json = JsonSerializer.Serialize(t);
        File.WriteAllText(filePath, json);
    }
    • Save 메서드는 제네릭으로 정의되었으며 객체 t를 JSON 형식으로 직렬화하고, 지정된 이름인 name 과 함께 지정된 파일 경로에 저장됨.
    • JsonSerializer.Serailize를 활용하여 객체를 JSON 문자열로 변환하고 File.WriteAllText를 통해 파일에 쓰게함.

     

    public static T? Load<T>(string name) where T : class
    {
        string filePath = $@"{basePath}\{name}.json";
    
        if (!File.Exists(filePath))
        {
            return null;
        }
        else
        {
            string json = File.ReadAllText(filePath);
            T t = JsonSerializer.Deserialize<T>(json);
            if (t == null)
            {
                return null;
            }
            else
            {
                return t;
            }
        }
    }
    • Load 메서드는 주어진 이름 name을 가진 JSON 파일을 로드하고 파일이 존재하지 않으면 null을 반환함.
    • 파일이 존재하는 경우 파일 내용을 읽고 JSON 역직렬화를 수행하여 객체로 변환하고 객체를 반환함.
    • JsonSerializer.Deserialize를 통해 JSON 문자열을 객체로 역직렬화함. 

     

     

    댓글