【Unity】JSONを扱う方法

Unityを使ってゲーム開発をするとき、オブジェクトデータをJSON形式に変換してファイル書き出しするというような場面は結構あると思います。
今回は、JSONとはなにかわざわざ教えてもらわなくてもいいけど、UnityでJSONを扱うときはどうすればいいんだったか端的に知りたいという忙しい方向けに、JsonUnityの使い方、書式を端的に説明していきたいと思います。
オブジェクト→JSONへ変換
以下のようなクラスがあるとします
[System.Serializable]
public class Person
{
public int age;
public string name;
}
以下のとおりインスタンスを作りました。
Person person = new Person ();
person.age = 35;
person.name = "Yamada Taro";
◆これをJSONに変換する場合は以下です↓
string jsonstr = JsonUtility.ToJson (person);
Debug.Log (jsonstr);で出力を見てみると、以下画像のようになります。

JSON→オブジェクトへ変換
次は、先程JSONに変換した文字列をオブジェクトに戻してあげます。
◆以下のように書きます。
Person person2 = JsonUtility.FromJson<Person> (jsonstr);
Debug.Log (person2.age);、Debug.Log (person2.name);で出力を見てみると、以下の画像のようになります。

Tips
インデント付きJSONに変換する
そのままオブジェクトをJSONに変換すると、ファイルに書き込んだときに一行に書き込まれてしまいます。

ただのデータとして扱う分にはなんの不自由もありませんが、デバッグ時などデータが見づらく不便です。
そんなときは、JsonUtility.ToJson の第二引数にtrueを指定してあげます。
string json = JsonUtility.ToJson(person,true);
これで試しにファイルに書き込んでみると、以下の画像のように見やすくなります。

JSONデータのファイル書き出し関数を作る
ついでに、JSONデータをファイルに書き出す関数をつくっておきましょう。
まずは、ファイル書き込みのために、System.IOモジュールをインポートします。
using System.IO;
次は、以下のコード(関数)をコピペしましょう。
void Save<T>(T person, string filepath)
{
string json = JsonUtility.ToJson(person,true);
StreamWriter wr = new StreamWriter(filepath, false);
wr.WriteLine(json);
wr.Close();
}
使い方は以下のとおりです。
Save<Person>(person, "sample.json");
<>の中にクラス名、第一引数にそのオブジェクト、第二引数に書き出すファイルのパスを指定します。(sample.jsonはUnityプロジェクトのルートディレクトリに生成されます)
この関数を使えば、クラス形式のデータであれば、汎用的にJSONファイルへ落とし込めます。
ネスト構造のオブジェクトをJSONに変換してみる
※ここからは中級者~向けの内容です
実際のゲームを作るとなったら、データ構造的にはオブジェクトの中にオブジェクトのプロパティをもたせるなどというネスト構造のオブジェクトも必要になるかもしれません。
その場合も、同じ方法でJsonへ変換できます。
例として、Jobクラスを作成し、PersonクラスにJobクラスをもたせます。
Jobクラス↓
[Serializable]
public class Job
{
public string company;
public string position;
}
Personクラス↓
[Serializable]
public class Person
{
public int age;
public string name;
public Job job; // Jobクラスを持たせる
}
インスタンス作成&書き出し↓
Person person=new Person(){
age=20,
name="Taro",
job=new Job(){
company="ABC",
position="Engineer"
}
};
Save<Person>(person, "sample.json");
Save関数の中身は一切変えていないのでご安心を。
結果は以下の画像のとおりです

リスト構造のデータをJSONに変換してみる
では、リストデータをJSONに変換したい場合はどうでしょうか?
この場合少し注意が必要です。
なぜかというと、UnityのJsonUtilityは、List<T> や Dictionary<K, V> のようなコレクションを直接JSON化できない という制約があるからです。
実際に変換しようとすると、空({})が変えてきます。
ではどうするかといいますと、クラスを作り、そのフィールドとしてリストを持たせて上げることでJSON化できるようになります。
やり方をこれから解説していきます。
まず、以下のように、リストをもたせるためのクラスを作ります。
[Serializable]
public class PersonList{
public List<Person> list=new List<Person>();
}
インスタンスを作ります↓
PersonList personList = new PersonList();
今回は、リストということで、Personインスタンスを2個作ります。
Person person1=new Person(){
age=20,
name="Taro",
job=new Job(){
company="ABC",
position="Engineer"
}
};
Person person2=new Person(){
age=30,
name="Hanako",
job=new Job(){
company="DEF",
position="Designer"
}
};
それをPersonListインスタンスにリストとしてもたせて上げます。
personList.list.Add(person1);
personList.list.Add(person2);
先ほど作ったSave関数にてJSON型で保存できていたらOKです。
Save<PersonList>(personList, "sample.json");
結果画像↓

これであなたもJSONの使い手に!
オブジェクトとJSONを相互に変換する方法について今回やってきました。
ゲームデータを保存する場合にもつかえますし、デバッグ用にデータを確認する場合にも使えます。
覚えておくと役立つ場面があるかと思いますので、ぜひしっかり押さえておきましょう!