프로그래밍/유니티 및 C#

[유니티/C#] Json을 원하는 타입으로 읽기/쓰기 (Generic 사용)

바토파 2023. 11. 3. 17:37
반응형

Newtonsoft의 Json.NET을 사용하였다.

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.IO;

밑의 코드들은 위의 코드를 넣어주어야 사용 가능하다.

 

Data = ReadJson<Data의 타입>("Json 파일명");

public T ReadJson<T>(string fileName)
{
    TextAsset textAsset = Resources.Load<TextAsset>(fileName);

    return JsonConvert.DeserializeObject<T>(textAsset.ToString());
}

Assets/Resources 안에 있는 Json 파일을 읽어오는 코드이다.

 

filePath = Application.persistentDataPath;
Data = ReadJson<Data의 타입>("Json 파일명");

public T ReadJson<T>(string fileName) where T : new()
{
    if (System.IO.File.Exists(filePath + "/" + fileName + ".json"))
    {
        using (StreamReader file = File.OpenText(filePath + "/" + fileName + ".json"))
        using (JsonTextReader reader = new JsonTextReader(file))
        {
            JObject json = (JObject)JToken.ReadFrom(reader);

            return JsonConvert.DeserializeObject<T>(json.ToString());
        }
    }
    else
    {
        return new T();
    }
}

기기 안에 있는 Json 파일을 읽어오는 코드이다.

Json 파일이 없다면 new()를 통해 새로운 객체를 만들어 반환한다.

 

WriteJson(Data, "파일명.json");

public void WriteJson<T>(T input, string fileName)
{
    string json = JsonConvert.SerializeObject(input);
    JObject jobject = JObject.Parse(json);

    File.WriteAllText(filePath + "/" + fileName, jobject.ToString());
}

기기에 Json 파일을 저장하는 코드이다.

 

Dictionary 형태가 아닌

[System.Serializable]
public class GameData
{
    public int month;
    public int year;
    public int reputation;
    public int gold;
}

이런 클래스도 읽고 쓸 수 있지만 [System.Serializable]을 붙여줘야 한다.

 

public void ReadItemList()
{
    itemList = IOManager.instance.ReadJson<Dictionary<string, ItemInfo>>("ItemList");
}

위의 코드에 있는 IOManager처럼 입출력을 관리하는 싱글톤 객체를 만든 후 사용하면 편하다.

반응형