[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はなんか両方ともダメらしいが・・・
↓

