JsonUtility クラスを使用して、Unity オブジェクトと JSON 形式間で変換できます。 例えば、JSON シリアライゼーションを使用してウェブサービスとやり取りしたり、データをテキストベースの形式に簡単にパックしたりアンパックしたりすることができます。
JSON 形式とのシリアル化では、“構造化された” JSON という概念を使用しています。つまり、クラスや構造体を作成して、JSON データに保存したい変数を記述します。以下はその例です。
[Serializable]
public class MyClass
{
public int level;
public float timeElapsed;
public string playerName;
}
これは、3 つの変数 (level、timeElapsed、playerName) を含む簡易な C# クラスを定義し、JSON シリアライザーで動作するように、Serializable
属性でマークしています。クラスのインスタンスの作成は、以下のように行います。
MyClass myObject = new MyClass();
myObject.level = 1;
myObject.timeElapsed = 47.5f;
myObject.playerName = "Dr Charles Francis";
その後、JsonUtility.ToJson メソッドを使って、JSON 形式にシリアライズ (変換) します。
string json = JsonUtility.ToJson(myObject);
// json には以下の内容が含まれています。'{"level":1,"timeElapsed":47.5,"playerName":"Dr Charles Francis"}'
JSON をオブジェクトに戻すには、JsonUtility.FromJson を使用します。
myObject = JsonUtility.FromJson<MyClass>(json);
これにより、MyClass
の新しいインスタンスが作成され、JSON データを使用して値が設定されます。JSON データに MyClass
のフィールドにマップされていない値が含まれている場合、シリアライザーはこれらの値を無視します。JSON データに MyClass
のフィールドの値が含まれていない場合、シリアライザーは、これらのフィールドの構築された値を、返されたオブジェクトに残します。
JSON シリアライザーは、現在、構造化されていない JSON の操作をサポートしていません。つまり、キーと値のペアからなる任意のツリーとして JSON を走査、編集することができます。これを行う必要がある場合は、より完全な機能を備えた JSON ライブラリを探す必要があります。
既存のオブジェクトに JSON データをデシリアライズすることもでき、その場合は既存のデータが上書きされます。
JsonUtility.FromJsonOverwrite(json, myObject);
JSON データにフィールドの値が含まれていない場合、シリアライザーはそのフィールドの値を変更しません。この方法では、以前に作成したオブジェクトを再利用することで、割り当てを最小限に抑えることができます。また、フィールドの一部のサブセットしか含まれていない JSON で意図的に上書きすることで、オブジェクトに “パッチ” 処理を行うこともできます。
注意: JSON Serializer API は、MonoBehaviour とScriptableObject のサブクラスのほか、簡易な構造体やクラスもサポートしています。ただし、JSON を MonoBehaviour
や ScriptableObject
のサブクラスにデシリアライズする場合は、FromJsonOverwrite メソッドを使用する必要があります。FromJson を使おうとすると、この動作はサポートされていないため、例外がスローされます。
JSON Serializer API は、MonoBehaviour
サブクラス、ScriptableObject
サブクラス、Serializable
属性を持つ簡易なクラスや構造体をサポートしています。オブジェクトを標準の Unity シリアライザーに渡して処理する際には、Inspector での処理と同じルールと制限が適用されます。Unity はフィールドのみをシリアライズします。また、Dictionary<>
のような型はサポートされません。
Unity は、プリミティブ型や配列など、他の型を直接 API に渡すことをサポートしていません。それらを変換する必要がある場合は、クラス
または 構造体
のような形でラップしてください。
エディターのみでは、並列 API である EditorJsonUtility によって、UnityEngine.Object から派生する任意のオブジェクトを、JSONにシリアライズしたり、その逆を行うことができます。これにより、オブジェクトの YAML 形式と同じデータを含む JSON が生成されます。
ベンチマークテストによると、JsonUtility は、このクラスが提供する機能があるケースでは少ないにもかかわらず、一般的な .NET JSON ソリューションよりも大幅に高速です。
ガベージコレクション (GC) のためのメモリ使用量は最小限に抑えられています。
JsonUtility API は、バックグラウンドのスレッドから使用することができます。ただし、他のマルチスレッドコードと同様に、あるスレッドでオブジェクトをシリアライズまたはデシリアライズしている間に、別のスレッドでオブジェクトにアクセスしたり変更したりしないように注意してください。
ToJson メソッドは、JSON 出力の整形表示 (pretty-print) をサポートしています。デフォルトではオフになっていますが、true
を 2 番目のパラメーターとして渡すことでオンにすることができます。
NonSerialized
属性を使用すると、出力からフィールドを除くことができます。
オブジェクトの型が事前にわからない場合は、JSON を “共通” のフィールドを含むクラスや構造体にデシリアライズし、そのフィールドの値を使って実際に必要な型を調べます。その後、2 回目のデシリアライズでその型に変換します。
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.