[TIL] JsonUtility에서 enum 파싱 안되는 문제

백성은·2025년 6월 24일

TIL

목록 보기
33/34

📌 문제 상황

Unity에서 Excel → JSON → C# 클래스 구조를 자동 생성해 쓰는 툴을 만들고 있었다.
Item 데이터 구조는 아래와 같았다:

public enum ItemType
{
    Weapon,
    Armor,
}

[Serializable]
public class Item
{
    public int id;
    public ItemType type;
    public string name;
    public int value;
}

엑셀로 만든 데이터는 JSON으로 이렇게 변환된다:

{
  "items": [
    {
      "id": 1,
      "type": "Weapon",
      "name": "Sword",
      "value": 12
    },
    {
      "id": 2,
      "type": "Armor",
      "name": "Shield",
      "value": 111
    }
  ]
}

🔍 원인 분석

Unity 기본 JsonUtility를 사용해서 다음처럼 파싱했지만:

[Serializable]
private class ItemListWrapper
{
    public List<Item> items;
}

public static List<Item> Load(TextAsset jsonFile)
{
    var wrapper = JsonUtility.FromJson<ItemListWrapper>(jsonFile.text);
    return wrapper?.items ?? new List<Item>();
}

Item.type필드가 "Weapon"이나 "Armor"로 올바르게 파싱되지 않고, 모두 기본값(ItemType.Weapon)으로 들어가는 현상 발생

즉, JsonUtility는 문자열 -> enum으로의 역직렬화(mapping)를 제대로 지원하지 않음.

🛠️ 해결 방법

Newtonsoft.Json은 문자열 enum을 자동으로 역직렬화해주므로, 아래처럼 바꾸면 문제 해결

로더 수정

using Newtonsoft.Json;

private class ItemListWrapper
{
    public List<Item> items;
}

public static List<Item> Load(TextAsset jsonFile)
{
    if (jsonFile == null) return new List<Item>();
    var wrapper = JsonConvert.DeserializeObject<ItemListWrapper>(jsonFile.text);
    return wrapper?.items ?? new List<Item>();
}

✅ 결과

  • "Weapon" → ItemType.Weapon 으로 정확히 매핑됨
  • 모든 아이템이 원래의 enum 값을 잘 가지고 있음

추가로 JsonUtility와 Newtonsoft의 장단점

항목JsonUtility (Unity 기본)Newtonsoft.Json
장점가볍고, 별도 패키지 없이 사용 가능enum, 딕셔너리, 중첩 클래스 등 다양한 구조 지원
단점enum, 딕셔너리 등 지원 제한외부 패키지 설치 필요 (단점 거의 없음)

📝 결론

Unity에서 JSON 문자열 안에 enum 값을 넣어두고 제대로 파싱하려면, JsonUtility 대신 Newtonsoft.Json을 쓰는 것이 맞는 것 같다.

profile
게임 개발일지

0개의 댓글