Programing/Unity(C#)

[C#] Dictionary 형태로 json 데이터 파싱하기

hye3193 2024. 4. 9. 19:36
{
    "enemyStats" : [
        {
            "ID": 1001,
            "hp": 20,
            "damage": 35,
            "moveSpeed": 3,
            "skillGuage": 20,
            "objectDropPer": 35
        },
        {
            "ID": 1002,
            "hp": 25,
            "damage": 30,
            "moveSpeed": 2,
            "skillGuage": 15,
            "objectDropPer": 30
        },
        {
            "ID": 1003,
            "hp": 20,
            "damage": 30,
            "moveSpeed": 4,
            "skillGuage": 25,
            "objectDropPer": 40
        }
    ]
}

json 데이터를 준비해 준다

* json은 반드시 단일 오브젝트 형태로 존재해야 하기 때문에 배열을 감싸는 오브젝트를 하나 만들어주어야 한다(위 코드에서는 enemyStats이 그 역할을 함)

 

[Serializable]
public class EnemyStat
{
    public int ID;
    public int hp;
    public int damage;
    public float moveSpeed;
    public int skillGauge;
    public int objectDropPer;
}

[Serializable]
public class EnemyStatLoader
{
    public List<EnemyStat> enemyStats = new List<EnemyStat>();

    public Dictionary<int, EnemyStat> MakeDict()
    {
        Dictionary<int, EnemyStat> dict = new Dictionary<int, EnemyStat>();
        foreach (EnemyStat enemyStat in enemyStats)
            dict.Add(enemyStat.ID, enemyStat);
        return dict;
    }
}

위쪽 클래스는 json 배열 내 각 오브젝트들을 저장할 틀이고,

아래쪽 클래스는 json 오브젝트(배열)을 저장하기 위한 변수를 만들고, dictionary 형태로 저장하기 위한 메서드를 갖고 있다

둘 다 데이터를 파싱해야 하기 때문에 직렬화(Serializable)를 해주어야 한다

 

MakeDict은 파싱된 enemyStats 리스트를 가지고 dictionary 형태로 만들어주기 위한 메서드인데,

Linq를 이용해도 되고 위 코드처럼 foreach문을 돌며 Key값을 직접 지정해 주어도 된다

* Key 값은 각 오브젝트를 식별하는 역할을 하기에 각 오브젝트의 고유번호(id)나 문자열 등... 식별 가능한 값을 사용하면 된다

 

public class DataManager
{
    public Dictionary<int, EnemyStat> EnemyDict { get; private set; }

    public void Init()
    {
        EnemyDict = LoadJson<EnemyStatLoader, int, EnemyStat>("EnemyStatData").MakeDict();
    }

    Loader LoadJson<Loader, Key, Value>(string path)
    {
        TextAsset textAsset = Managers.Resource.Load<TextAsset>($"Data/{path}");
        return JsonUtility.FromJson<Loader>(textAsset.text);
    }
}

Data Manager에서 LoadJson을 통해 List 형태로 json 데이터를 파싱한 뒤, 이를 아까 본 아래쪽 클래스(Loader) 내의 MakeDict 메서드를 이용하여 dictionary 형태로 바꿔준다

 

Data Manager 내 EnemyDict에 접근하여 데이터를 활용하면 된다