// enum 변환 방법
itemType = (변환할 Enum)Enum.Parse(typeof(변환할 Enum), 문자열);
// ex
ItemType itemType = (ItemType)Enum.Parse(typeof(ItemType), values[인덱스]);
// 숫자 변환 방법
//숫자 변환:
int.Parse(values[인덱스];
float.Parse(values[인덱스])
// 원본 타입을 유지한 채 JSON으로 변환
string json = JsonSerialized.ConvertOriginalListToJson(dataArray, type);
// 파일로 저장
JsonSerialized.SaveJsonToFile(json, className[i]);
Debug.Log($"{className[i]} 데이터를 성공적으로 변환했습니다.");
}
■ JsonSerialized 클래스의 ConvertOriginalListToJson() 메서드를 실행 후 json 문자열을 return받는다
■JsonSerialized 클래스의 SaveJsonToFile() 메서드를 실행 후 json 파일을 저장한다.
📝 JsonSerialized.cs
- 전체코드
[SerializeField]
public class ListWrapper<T>
{
public List<T> values;
}
public static class JsonSerialized
{
// C:\Users\[user name]\AppData\LocalLow\[company name]\[product name]
static string savePath = Application.persistentDataPath;
// 원본 타입의 리스트를 변환하는 메서드 (리플렉션 사용)
public static string ConvertOriginalListToJson(object dataArray, Type elementType)
{
// dataArray는 현재 List<T>
// 1. 적절한 ListWrapper<tyoe> 타입 생성
Type wrapperType = typeof(ListWrapper<>).MakeGenericType(elementType);
// 2. 래퍼 인스턴스 생성
object wrapper = Activator.CreateInstance(wrapperType);
// 3. values 필드 가져오기
FieldInfo valuesField = wrapperType.GetField("values");
// 4. dataArray를 values 필드에 할당
// dataArray는 object타입이지만 실제로는 List<T> (매개변수로 List<T>를 넘겼기 때문)
valuesField.SetValue(wrapper, dataArray);
// 5. JsonUtility로 직렬화
return JsonUtility.ToJson(wrapper);
}
public static void SaveJsonToFile(string json, string saveFileName)
{
try
{
string path = Path.Combine(savePath, saveFileName);
File.WriteAllText(path, json);
Debug.Log($"{saveFileName}이 저장되었습니다. 경로: {path}");
}
catch (Exception ex)
{
Debug.LogError($"파일 저장 중 오류 발생: {ex.Message}");
}
}
}
- 상세코드
🔖 ConvertOriginalListToJson() 메서드
// dataArray는 현재 List<T>
// 1. 적절한 ListWrapper<tyoe> 타입 생성
Type wrapperType = typeof(ListWrapper<>).MakeGenericType(elementType);
■ ListWrapper클래스의 제네릭 타입을 위에서 매개변수의 type(현재 클래스의 타입)으로 설정한다.
// 2. 래퍼 인스턴스 생성
object wrapper = Activator.CreateInstance(wrapperType);
■Reflection의 Activator.CreateInstance를 사용해서제네릭 클래스인 ListWrapper를 인스턴스화 한다.
public interface ICsvParsable
{
void Parse(string[] values);
}
📝 Stage.cs - 테스트용 클래스
[System.Serializable]
public class Stage : ICsvParsable
{
[SerializeField] private int hp;
[SerializeField] private string name;
[SerializeField] private List<string> animal;
public void Parse(string[] values)
{
hp = int.Parse(values[0]);
name = values[1];
animal = new List<string>();
string[] temp = values[3].Split('-');
for (int i = 0; i < temp.Length; i++)
{
animal.Add(temp[i]);
}
}
}
■ [System.Serializable]
□ 직렬화 하기 위해서 클래스 위에 추가한다
■ csv를 파싱한 데이터를 필드에 넣기위해서 ICsvParsable 인터페이스를 구현한다
■ Parse(string[] values)
□ 필드에 맞게 변수를 형변환해서 필드를 설정한다
📝 CsvJsonButton.cs
[CustomEditor(typeof(CsvToJsonConverter))]
public class CsvJsonButton : Editor
{
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
CsvToJsonConverter mana = (CsvToJsonConverter)target;
if (GUILayout.Button("Cvs to Json"))
{
mana.CsvConverByName();
}
}
}