Long-Slow-Distance

Programming Notes with Unity

メニュー

[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次元になってるので、まぁそうなるわなという感じか。

【多次元配列版】

160424_json_to_array_error

【ジャグ配列版】

160424_json_to_array_ok

最近Unityに入ったJSONUtilityはなんか両方ともダメらしいが・・・

参考:
http://polaris-bear.lolipop.jp/shunroom/402

関連記事