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;
}
}
}