C# で列挙型を JSON 文字列としてシリアライズする代替方法
JavaScriptSerializer を使った場合、列挙型はデフォルトで数値としてシリアライズされます。しかし、人間が読みやすいように列挙型の名前 (文字列) でシリアライズしたいケースもあるでしょう。
列挙型を文字列としてシリアライズするには、JavaScriptSerializer に対して特別な属性は使えません。 代替案としては、カスタムシリアライゼーションを行うことが必要です。
より良い方法は、System.Text.Json ライブラリ を使うことです。System.Text.Json は ASP.NET Core で推奨されているシリアライゼーションライブラリで、列挙型を文字列としてシリアライズする機能が備わっています。
System.Text.Json で列挙型を文字列としてシリアライズする方法 は以下の通りです。
- JsonSerializerOptions クラス をインスタンス化します。
- そのインスタンスに対して、JsonStringEnumConverter クラスを追加します。
- シリアライズしたいオブジェクトと共に、上記のオプションを渡して
Serialize
メソッドを呼び出します。
これにより、列挙型は ToString
メソッドで取得された文字列として JSON にシリアライズされます。
ポイント:
- JavaScriptSerializer では列挙型を文字列としてシリアライズできない。
- System.Text.Json を使って、
JsonStringEnumConverter
を設定することで可能。 - シリアライズされた JSON は人間が読みやすい形式 (列挙型の名前) になる。
C# の列挙型を JSON 文字列としてシリアライズする例
JavaScriptSerializer を使った従来の方法 (推奨されません)
using System.Web.Script.Serialization;
public enum Color
{
Red,
Green,
Blue
}
public class MyClass
{
public Color FavoriteColor { get; set; }
}
// JavaScriptSerializer を使う
JavaScriptSerializer serializer = new JavaScriptSerializer();
MyClass myObject = new MyClass { FavoriteColor = Color.Green };
string json = serializer.Serialize(myObject);
Console.WriteLine(json); // {"FavoriteColor":1}
解説:
- JavaScriptSerializer は古いライブラリで、新しいプロジェクトでは System.Text.Json を使うことが推奨されます。
- 上記のコードでは、FavoriteColor プロパティは数値の 1 としてシリアライズされてしまいます。
System.Text.Json を使った推奨方法
using System.Text.Json;
using System.Text.Json.Serialization;
public enum Color
{
Red,
Green,
Blue
}
public class MyClass
{
public Color FavoriteColor { get; set; }
}
// System.Text.Json を使う
var options = new JsonSerializerOptions
{
Converters = { new JsonStringEnumConverter() }
};
MyClass myObject = new MyClass { FavoriteColor = Color.Green };
string json = JsonSerializer.Serialize(myObject, options);
Console.WriteLine(json); // {"FavoriteColor":"Green"}
- JsonSerializerOptions で JsonStringEnumConverter を設定することで、列挙型を文字列としてシリアライズできます。
- JsonSerializer.Serialize メソッドにオプションを渡すことで、この設定を適用します。
さらに詳細なカスタマイズ
var options = new JsonSerializerOptions
{
Converters = { new JsonStringEnumConverter(JsonNamingPolicy.CamelCase) }
};
- JsonNamingPolicy.CamelCase を指定することで、プロパティ名や列挙型名が camelCase 形式に変換されます。
- 他の JsonNamingPolicy も利用可能です。
- System.Text.Json は、C# で JSON を扱うための新しいライブラリで、より柔軟な設定が可能です。
- JsonStringEnumConverter を使うことで、列挙型を文字列としてシリアライズできます。
- JsonSerializerOptions で様々な設定を行うことができます。
注意点:
- JavaScriptSerializer は古いライブラリなので、新しいプロジェクトでは使用を避けるべきです。
- System.Text.Json は ASP.NET Core で標準的にサポートされています。
- 上記のコードは簡略化されたものです。実際のプロジェクトでは、より複雑なオブジェクトやシリアライズ設定が必要になる場合があります。
Newtonsoft.Json (Json.NET)
- 特徴: 高機能で柔軟性が高いJSONライブラリ。多くのプロジェクトで採用されている。
- 方法:
StringEnumConverter
を利用して列挙型を文字列に変換する。 - メリット: カスタマイズ性の高さ、豊富な機能
- デメリット: ライブラリがやや重い、学習コストが少し高め
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
// ...
var settings = new JsonSerializerSettings { Converters = { new StringEnumConverter() } };
string json = JsonConvert.SerializeObject(myObject, settings);
DataContractJsonSerializer
- 特徴: WCF で使用されるシリアライザ。シンプルな構造のオブジェクトをシリアライズするのに適している。
- 方法:
DataContractAttribute
とEnumMemberAttribute
を使用して、シリアライズするプロパティと列挙型の値を指定する。 - メリット: シンプルな構造のオブジェクトをシリアライズするのに向いている
- デメリット: 柔軟性に欠ける、新しい機能が追加されない
using System.Runtime.Serialization.Json;
// ...
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(MyClass));
using (MemoryStream ms = new MemoryStream())
{
serializer.WriteObject(ms, myObject);
string json = Encoding.UTF8.GetString(ms.ToArray());
}
カスタムシリアライザの実装
- 特徴: 完全なカスタマイズが可能。特定の要件に合わせてシリアライザを設計できる。
- 方法:
ISerializer
インターフェースを実装し、独自のシリアライザを作成する。 - メリット: 柔軟性が高い、高度なカスタマイズが可能
- デメリット: 実装が複雑になる、開発コストが高い
- Utf8Json: 高速なシリアライザとして知られる。
- ServiceStack.Text: 高速でシンプルなシリアライザ。
どの方法を選ぶべきか
- シンプルで一般的なユースケース: System.Text.Json
- 高度なカスタマイズが必要な場合: Newtonsoft.Json、カスタムシリアライザ
- パフォーマンスが特に重要な場合: Utf8Json、ServiceStack.Text
- 既存のプロジェクトで特定のライブラリが使用されている場合: そのライブラリに合わせた方法
選ぶ際のポイント
- パフォーマンス: シリアライズ/デシリアライズの速度
- 機能: カスタム属性、null値の扱い、循環参照の処理など
- コミュニティ: サポートやドキュメントの充実度
- 学習コスト: ライブラリを学ぶためのコスト
C# で列挙型を JSON 文字列としてシリアライズする方法は、System.Text.Json 以外にもいくつかの選択肢があります。プロジェクトの要件や開発者のスキルに合わせて、最適な方法を選択してください。
- 各ライブラリには、より詳細な設定や機能が提供されています。
- 最新の情報を取得するためには、各ライブラリの公式ドキュメントを参照することをおすすめします。
c# asp.net json