[C#] LitJSONで2次元配列をデシリアライズする時はジャグ配列のみ有効?
LitJSONで2次元配列をシリアライズ・デシリアライズする際に遭遇した現象のメモ。
どうも多次元配列(int[,])だとデシリアライズが上手くなされないので、
ジャグ配列(int[x][])を使用すると良いらしい?
以下検証コード。
#define USE_JAGGED using UnityEngine; using System.Collections; using LitJson; [System.Serializable] public class HogeData { #if USE_JAGGED public HogeData() { // ジャグ配列の場合は初期化(中身のインスタンス確保)が必要 for( int i=0; i < _hogeArray.Length; ++i ){ _hogeArray[i] = new int[3]; } } #endif public int _id; #if USE_JAGGED public int[][] _hogeArray = new int[3][]; #else public int[,] _hogeArray = new int[3,3]; #endif } public class ArrayToJSONCheck : MonoBehaviour { // Awake void Awake() { // 適当に値を入れる for( int i=0; i < 3; ++i ){ for( int j=0; j < 3; ++j ){ #if USE_JAGGED m_HogeData._hogeArray[i][j] = i + j; #else m_HogeData._hogeArray[i,j] = i + j; #endif } } // JSONにシリアライズ m_StrHogeArray = JsonMapper.ToJson( m_HogeData ); // JSONをデシリアライズ m_DeserializedHogeData = JsonMapper.ToObject<HogeData>( m_StrHogeArray ); // デシリアライズ先の値をチェック for( int i=0; i < 3; ++i ){ for( int j=0; j < 3; ++j ){ #if USE_JAGGED Debug.Log(m_DeserializedHogeData._hogeArray[i][j]); #else // Exceptionが発生する Debug.Log(m_DeserializedHogeData._hogeArray[i,j]); #endif } } } // member public HogeData m_HogeData; public HogeData m_DeserializedHogeData; public string m_StrHogeArray; }
よく見ると多次元配列の方は生成されたJSON文字列が1次元になってるので、まぁそうなるわなという感じか。
【多次元配列版】
【ジャグ配列版】
最近Unityに入ったJSONUtilityはなんか両方ともダメらしいが・・・
↓