Unityにおける列挙型のJSON変換に関する技術資料

Unityの開発では、列挙型(enum)は状態の管理やオプション選択に便利です。列挙型のデータをJSON形式で保存したり通信に使用したりすることがしばしば求められます。本資料では、Unityで列挙型をJSONに変換する方法を説明し、JsonUtilityNewtonsoft.Json、および System.Text.Json の各ライブラリでのシリアライズの挙動を比較します。


1. JsonUtilityによる列挙型のシリアライズ

Unityの標準的なシリアライズライブラリであるJsonUtilityを使用すると、列挙型は数値としてシリアライズされます。列挙型の各値に対して定義された整数値が使用され、シンプルな出力が得られます。

サンプルコード

using UnityEngine;

public class MyClass
{
    public MyEnum myEnum;
}

public enum MyEnum
{
    FirstOption = 0,
    SecondOption = 1,
    ThirdOption = 2
}

public class TestJson : MonoBehaviour
{
    void Start()
    {
        MyClass obj = new MyClass { myEnum = MyEnum.SecondOption };
        string json = JsonUtility.ToJson(obj);
        Debug.Log(json); // 出力: {"myEnum":1}
    }
}

出力例

{"myEnum":1}

この例では、列挙型のメンバ MyEnum.SecondOption が数値 1 としてシリアライズされています。


2. Newtonsoft.Jsonによる列挙型のシリアライズ

Newtonsoft.JsonはC#でよく使われるサードパーティライブラリであり、Unityプロジェクトにも導入可能です。このライブラリでは、列挙型をデフォルトで文字列としてシリアライズします。ただし、設定により数値としてもシリアライズ可能です。

サンプルコード(デフォルト設定)

using Newtonsoft.Json;

public class MyClass
{
    public MyEnum myEnum;
}

public enum MyEnum
{
    FirstOption = 0,
    SecondOption = 1,
    ThirdOption = 2
}

public class TestJson
{
    public static void Main()
    {
        MyClass obj = new MyClass { myEnum = MyEnum.SecondOption };
        string json = JsonConvert.SerializeObject(obj);
        Console.WriteLine(json); // 出力: {"myEnum":"SecondOption"}
    }
}

出力例

{"myEnum":"SecondOption"}

数値としてシリアライズする方法

列挙型を数値としてシリアライズするには、JsonSerializerSettingsを使用します。

string json = JsonConvert.SerializeObject(obj, new JsonSerializerSettings
{
    Converters = new[] { new Newtonsoft.Json.Converters.StringEnumConverter() },
    Formatting = Formatting.Indented
});

3. System.Text.Jsonによる列挙型のシリアライズ

.NET Core.NET 5+で導入されたSystem.Text.Jsonも、列挙型をデフォルトで文字列としてシリアライズしますが、設定によって数値に変えることが可能です。

サンプルコード(デフォルト設定)

using System.Text.Json;

public class MyClass
{
    public MyEnum myEnum;
}

public enum MyEnum
{
    FirstOption = 0,
    SecondOption = 1,
    ThirdOption = 2
}

public class TestJson
{
    public static void Main()
    {
        MyClass obj = new MyClass { myEnum = MyEnum.SecondOption };
        string json = JsonSerializer.Serialize(obj);
        Console.WriteLine(json); // 出力: {"myEnum":"SecondOption"}
    }
}

出力例

{"myEnum":"SecondOption"}

数値としてシリアライズする方法

var options = new JsonSerializerOptions
{
    Converters = { new JsonStringEnumConverter() }
};
string json = JsonSerializer.Serialize(obj, options);

比較まとめ

ライブラリデフォルトのシリアライズ数値でのシリアライズ
Unity JsonUtility数値
Newtonsoft.Json文字列設定で数値に変更可
System.Text.Json文字列設定で数値に変更可

まとめ

Unityのプロジェクトで列挙型をJSON形式に変換する場合、JsonUtilityでは数値として扱われますが、他のライブラリ(Newtonsoft.JsonSystem.Text.Json)ではデフォルトで文字列として扱われます。シリアライズ方式を選択する際は、プロジェクトの要件に応じて適切なライブラリと設定を選ぶことが重要です。

C#,JSON,Unity

Posted by hidepon