トップ > 【Unity】UnityでJSONを扱う方法を紹介します!配列のシリアライズ対応方法やディープコピーのテクニックなども紹介しますよ!
更新日 2024/3/28

【Unity】UnityでJSONを扱う方法を紹介します!配列のシリアライズ対応方法やディープコピーのテクニックなども紹介しますよ!

JSON(JavaScript Object Notation)とはJavaScriptにおけるオブジェクトのデータ表記でテキストベースのデータ交換用フォーマットです。プログラミング言語を問わず利用でき、近年ではXMLに代わってJSONが多く採用されています。

JSON thumbnail

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変数は以下の内容になります。

{"name":"ひのきのぼう","price":5}

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変数の内容は以下のようになります。

{"_":[{"name":"ひのきのぼう","price":5},{"name":"こんぼう","price":30},{"name":"どうのつるぎ","price":100}]}

ここで欲しいのは[]を含む赤字の内容です。

{"_":[{"name":"ひのきのぼう","price":5},{"name":"こんぼう","price":30},{"name":"どうのつるぎ","price":100}]}

最初の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も利用できるようになりできることの幅が広がりますよ。

関連ページ

こちらのページも合わせてご覧下さい

singleton
【Unity】シングルトンパターンを実装する方法を紹介します!2024/3/1
resident_object
【Unity】ゲームオブジェクトを常駐化させるための方法を紹介します!2024/3/1
http_client_manager
【Unity】HttpClientをシングルトン化したHttpClientManagerの実装方法について紹介します!2024/3/1
resource
【Unity】スクリプトからテクスチャーなどのリソースを読み込む様々な方法を紹介します!2024/2/9
event_init
【Unity】MonoBehaviourの初期化イベントについて考察します!2024/2/12

Copyright ©2022 - 2024 うにぉらぼ