【Unity】UnityでJSONを扱う方法を紹介します!配列のシリアライズ対応方法やディープコピーのテクニックなども紹介しますよ!
JSON(JavaScript Object Notation)とはJavaScriptにおけるオブジェクトのデータ表記でテキストベースのデータ交換用フォーマットです。プログラミング言語を問わず利用でき、近年ではXMLに代わってJSONが多く採用されています。
UnityでJSONを使ってみたいけど、どうすればいいのかな?
初めての方にも分かりやすく簡単に解説しますね。
UnityにおけるJSON
UnityではJSONを扱うためにJsonUtilityクラスが提供されています。シリアライズしたいクラスにはSystem.Serializable属性を付加します。メンバー変数は以下のパターンの時シリアライズされます。
シリアライズされる変数のパターン |
---|
1. publicにする |
2. UnityEngine.SerializeField属性を付加する |
[System.Serializable]
public class Item
{
public string name; // 1
[SerializeField]
private int price; // 2
public Item(string name, int price)
{
this.name = name;
this.price = price;
}
}
JSONへ変換するにはJsonUtility.ToJson関数を利用します。
Item item = new Item("ひのきのぼう", 5);
string json = JsonUtility.ToJson(item);
この時json変数は以下の内容になります。
JSONをオブジェクトへ復元するにはJsonUtility.FromJson関数を利用します。
Item item = JsonUtility.FromJson<Item>(json);
以上でJsonUtilityクラスの基本的な使い方は終了です。
JsonUtilityクラスを利用すれば簡単だね!
配列に対応する
JsonUtilityではオブジェクト配列をJSONに直接変換することができません。配列をダミークラスでラップしてJSON化して配列部分だけを取り出すことで対応しましょう。まず初めに配列のラッパークラスを作成します。
[System.Serializable]
class ArrayWrapper<T>
{
public T[] _;
}
続いてJSON化したいオブジェクト配列を用意します。
Item[] items = new Item[]
{
new Item("ひのきのぼう", 5),
new Item("こんぼう", 30),
new Item("どうのつるぎ", 100),
};
ラッパークラスを用いてJSONに変換します。
string json = JsonUtility.ToJson(new ArrayWrapper<Item> { _ = items });
json変数の内容は以下のようになります。
ここで欲しいのは[]を含む赤字の内容です。
最初の5文字と最後の1文字が不必要になりますのでSubstring関数で除去します。
json.Substring(5, json.Length - 6);
これを関数化すると以下のようになります。
string ToJsonArray<T>(T[] objs)
{
string json = JsonUtility.ToJson(new ArrayWrapper<T> { _ = objs });
return json.Substring(5, json.Length - 6);
}
配列をJSONに変換する関数ができたので、続いて復元する関数を作りましょう。基本的にやることはToJsonArray関数の逆のことです。削除した文字列を付けてArrayWrapperクラスで復元し、配列部分を取り出せばOKです。
T[] FromJsonArray<T>(string json)
{
return JsonUtility.FromJson<ArrayWrapper<T>>("{\"_\":" + json + "}")._;
}
作成した2つの関数でJSON配列に対応できるようになりました。
配列は対応してないから自作しないといけないんだね!
JSONを利用したディープコピー
JSONに変換して復元することでオブジェクトのディープコピーを作成することができます。簡単にオブジェクトのコピーを作成できるテクニックを紹介します。
Item item = new Item("ひのきのぼう", 5);
string json = JsonUtility.ToJson(item);
Item newItem = JsonUtility.FromJson<Item>(json);
これを関数化すると以下のようになります。
public T Copy<T>(T obj)
{
return JsonUtility.FromJson<T>(JsonUtility.ToJson(obj));
}
public T[] CopyArray<T>(T[] objs)
{
return FromJsonArray<T>(ToJsonArray(objs));
}
Jsonを利用したディープコピーのテクニックを紹介しました。
サンプルプログラム
ここまでの内容をソースコードにまとめたJson.csをGitHubにアップしてありますのでご利用下さい。
code-examples/unity/Json.csオブジェクトのシリアライズ、デシリアライズ方法は以下の通りです。
Item item = ...;
string json = Json.Serialize(item);
Item item = Json.Deserialize<Item>(json);
オブジェクト配列のシリアライズ、デシリアライズ方法は以下の通りです。
Item[] items = ...;
string json = Json.SerializeArray(items);
Item[] items = Json.DeserializeArray<Item>(json);
オブジェクトと配列のディープコピー方法は以下の通りです。
Item newItem = Json.Copy(item);
Item[] newItems = Json.CopyArray(items);
簡単にJSONを扱えるから試してみてね!
まとめ
今回の記事のまとめだよ!
1.JsonUtilityを利用しよう! 2.配列に対応する場合は自作しよう! 3.JSONを利用したディープコピーもできるよ! | ||
JSONを扱えるようになるとデータ管理が楽になるね!
Web上のAPIも利用できるようになりできることの幅が広がりますよ。
関連ページ
こちらのページも合わせてご覧下さい