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>();
}
| 항목 | JsonUtility (Unity 기본) | Newtonsoft.Json |
|---|---|---|
| 장점 | 가볍고, 별도 패키지 없이 사용 가능 | enum, 딕셔너리, 중첩 클래스 등 다양한 구조 지원 |
| 단점 | enum, 딕셔너리 등 지원 제한 | 외부 패키지 설치 필요 (단점 거의 없음) |
Unity에서 JSON 문자열 안에 enum 값을 넣어두고 제대로 파싱하려면, JsonUtility 대신 Newtonsoft.Json을 쓰는 것이 맞는 것 같다.