using System; using UnityEngine; namespace UVC.Json { /// /// JsonUtility를 이용한 배열 직렬화/역직렬화 /// Unity의 기본 JsonUtility는 최상위 배열을 지원하지 않기 때문에 Wrapper 클래스를 사용하여 이 문제를 해결합니다. /// 참조: https://stackoverflow.com/questions/36239705/serialize-and-deserialize-json-and-json-array-in-unity /// public static class JsonUtilityHelper { /// /// JSON 문자열을 T 타입 배열로 역직렬화합니다. /// /// 배열 요소의 타입 /// 역직렬화할 JSON 문자열 /// 역직렬화된 T 타입 배열 /// /// /// // Player 클래스가 [Serializable] 속성을 가지고 있다고 가정 /// string jsonData = "{\"Items\":[{\"name\":\"플레이어1\",\"level\":10},{\"name\":\"플레이어2\",\"level\":20}]}"; /// Player[] players = JsonUtilityHelper.FromJson(jsonData); /// // players[0].name == "플레이어1", players[0].level == 10 /// // players[1].name == "플레이어2", players[1].level == 20 /// /// public static T[] FromJson(string json) { Wrapper wrapper = JsonUtility.FromJson>(json); return wrapper.Items; } /// /// T 타입 배열을 JSON 문자열로 직렬화합니다. /// /// 배열 요소의 타입 /// 직렬화할 배열 /// 직렬화된 JSON 문자열 /// /// /// // Player 클래스가 [Serializable] 속성을 가지고 있다고 가정 /// Player[] players = new Player[] /// { /// new Player { name = "플레이어1", level = 10 }, /// new Player { name = "플레이어2", level = 20 } /// }; /// /// string json = JsonUtilityHelper.ToJson(players); /// // json == "{\"Items\":[{\"name\":\"플레이어1\",\"level\":10},{\"name\":\"플레이어2\",\"level\":20}]}" /// /// public static string ToJson(T[] array) { Wrapper wrapper = new Wrapper(); wrapper.Items = array; return JsonUtility.ToJson(wrapper); } /// /// T 타입 배열을 JSON 문자열로 직렬화합니다. 가독성 향상을 위한 들여쓰기 옵션을 제공합니다. /// /// 배열 요소의 타입 /// 직렬화할 배열 /// 들여쓰기를 포함한 가독성 높은 형식 사용 여부 /// 직렬화된 JSON 문자열 /// /// /// // Player 클래스가 [Serializable] 속성을 가지고 있다고 가정 /// Player[] players = new Player[] /// { /// new Player { name = "플레이어1", level = 10 }, /// new Player { name = "플레이어2", level = 20 } /// }; /// /// string json = JsonUtilityHelper.ToJson(players, true); /// // json은 다음과 같이 들여쓰기가 포함된 형식: /// // { /// // "Items": [ /// // { /// // "name": "플레이어1", /// // "level": 10 /// // }, /// // { /// // "name": "플레이어2", /// // "level": 20 /// // } /// // ] /// // } /// /// public static string ToJson(T[] array, bool prettyPrint) { Wrapper wrapper = new Wrapper(); wrapper.Items = array; return JsonUtility.ToJson(wrapper, prettyPrint); } /// /// 배열을 위한 직렬화 래퍼 클래스입니다. /// Unity의 JsonUtility는 최상위 배열을 직접 지원하지 않기 때문에 이 클래스로 배열을 감싸줍니다. /// /// 배열 요소의 타입 [Serializable] private class Wrapper { public T[] Items; } } }