そういうのがいいブログ

アプリ個人開発 まるブログ

アプリ開発覚え書き

【Unity】LitJsonでジャグ配列を文字列へ変換する

はじめに

LitJsonでジャグ配列を使う メモ

・Unity標準のJsonUtilityではジャグ配列を文字列に変換できない
・LitJsonを使用すれば使えるようになる
ということでLitJsonを使用していきます。
使用するにはまず、前準備が必要です。

前準備

Githubからファイルをダウンロードします。
github.com

Code→DownLoad ZIP
f:id:marumaro7:20220319042353p:plain

ダウンロードしたファイルの「src」というフォルダを
UnityのAssetsに入れます。
f:id:marumaro7:20220319043524p:plain

これで準備完了です。

使い方1

いきなりジャグ配列を使うとわかりにくいので、
int型とstring型の変数を使ったサンプルを載せます。
やっていることは下記です。
・セーブされた文字列を元のクラスの形に戻す(セーブデータがあれば)
・変数を変更
・文字列への変換&セーブ

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using LitJson;

public class LitJsonTest : MonoBehaviour
{
    string json;

    private void Start()
    {
        Player player = new Player();

        //セーブキーを持っていたら処理
        if (PlayerPrefs.HasKey("SaveKey"))
        {
            json = PlayerPrefs.GetString("SaveKey");//セーブデータから文字列を読み込み

            print("json = " + json);

            player = JsonMapper.ToObject<Player>(json);//読み込んだ文字列からPlayerクラスの値を設定

            print("HP = " + player.hp);
            print("Name = " + player.name);
            print("SkillName = " + player.skillName);
        }


        //データを変更
        player.hp += 10;
        player.name = "勇者";
        player.skillName = "abc";

        json = JsonMapper.ToJson(player);//playerクラスを文字列に変換
        PlayerPrefs.SetString("SaveKey", json);//文字列をセーブ

        print("json = " + json);
    }
        
}

public class Player
{
    public int hp;
    public string name;
    public string skillName;
}

結果

初回実行時(セーブデータがないので変数の変更 と 保存のみ) f:id:marumaro7:20220319053836p:plain

2回目実行時 f:id:marumaro7:20220319053949p:plain

ポイント

名称の書き方が不適切かもしれませんが、重要なのはこの2つです。

文字列への変換

JsonMapper.ToJson(変換したいクラス);

文字列からクラスへの変換

JsonMapper.ToObject<クラス名>(保存していた文字列);

ジャグ配列を使用

本題のジャグ配列を文字列へ変換するサンプルです。
先ほどのサンプルで書いていたPlayerクラスの変数はジャグ配列一つにしました。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using LitJson;

public class LitJsonTest : MonoBehaviour
{
    string json;

    private void Start()
    {
        Player player = new Player();

        player.skillId = new int[3][];//最初の要素数の指定

        player.skillId[0] = new int[2];
        player.skillId[1] = new int[3];
        player.skillId[2] = new int[4];


        //セーブキーを持っていたら処理
        if (PlayerPrefs.HasKey("SaveKey"))
        {
            json = PlayerPrefs.GetString("SaveKey");//セーブデータから文字列を読み込み

            print("セーブデータから読み込んだjson = " + json);

            player = JsonMapper.ToObject<Player>(json);//読み込んだ文字列からPlayerクラスの値を設定
                        
            for (int i = 0; i < player.skillId.Length; i++)
            {
                for (int n = 0; n < player.skillId[i].Length; n++)
                {
                    print("復元後SkillId" + "[" + i + "][" + n + "] = " + player.skillId[i][n]);
                }
            }
        }


        //データを設定
        for (int i = 0; i < player.skillId.Length; i++)
        {
            for (int n = 0; n < player.skillId[i].Length; n++)
            {
                player.skillId[i][n] = i + n;
            }
        }

        json = JsonMapper.ToJson(player);//playerクラスを文字列に変換
        PlayerPrefs.SetString("SaveKey", json);//文字列をセーブ

        print("セーブしたjson = " + json);
    }
        
}

public class Player
{
    public int[][] skillId;
}


結果

初回実行時 f:id:marumaro7:20220319060653p:plain

2回目実行時 f:id:marumaro7:20220319061233p:plain

ジャグ配列の文字列化と復元ができることが確認できました。

おわりに

Unity標準のJsonUtilityの方が処理速度が早いらしいので
JsonUtilityで処理できないときだけLitJsonを使うと良さそうです。

参考

blog.lab7.biz

nekosuko.jp