JsonSerializerの基本的な使い方とサンプルを説明します。
概要
- .NET Core 3.1の標準パッケージSystem.Text.Jsonに含まれるJsonSerializerを使って、クラス・プロパティの値をJSONに変換(シリアライズ)、JSONの値をクラス・プロパティに変換(デシリアライズ)する方法を説明します。
- Visual Studio 2019 + .NET Core 3.1(C#)の環境を前提とします。
- サンプルの完全なソースコードはこちらで公開しています。
- ここでは最低限の使い方の説明のみとなります。
より一般的な使い方は下記をご覧ください。。
使い方
クラス・プロパティをJSON文字列に変換する場合はJsonSerializer.Serialize()、逆にJSON文字列の内容をクラス・プロパティに変換する場合はJsonSerializer.Deserialize()を使用します。
変換対象となるクラス・プロパティの型によって、変換仕様が異なります。例えば、string型をシリアライズする場合は「”hello”」、intやlong型では「100, 1000」、bool型では「True/False」、がJSON文字列として出力されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | // シリアライズ(クラス・プロパティ -> JSON) var dic = new Dictionary<string, object>() { ["intValue"] = 100, ["stringValue"] = "ABCD", ["boolValue"] = true, ["intArrayValue"] = new int[]{ 1, 2, 3, 4 } }; var serialized = JsonSerializer.Serialize(dic); Console.WriteLine($"serialized: {serialized}"); // デシリアライズ(JSON -> クラス・プロパティ) var deserialized = JsonSerializer.Deserialize<Dictionary<string, object>>(serialized); foreach(var kv in deserialized) Console.WriteLine($"deserialize: {kv.Key}: {kv.Value}"); |
1 2 3 4 5 6 7 8 9 10 11 | serialized: { "intValue":100, "stringValue":"ABCD", "boolValue":true, "intArrayValue":[1,2,3,4] } deserialize: intValue: 100 deserialize: stringValue: ABCD deserialize: boolValue: True deserialize: intArrayValue: [1,2,3,4] |
- Serialize(), Deserialize()メソッドには他の呼び出し方(オーバーロード)があります。
詳細はJsonSerializerのリファレンスをご覧ください。 - シリアライズ・デシリアライズ時の引数として、JsonSerializerOptionを指定することで動作をカスタマイズできます。
(JSONのフィールド名をキャメルケースにしたい、人が読みやすいようにインデントを追加する等) - メモリ上でのクラス・プロパティとJSON文字列(string型)の変換は良いのですが、ファイル入出力等のストリームを使った操作では、日本語が文字化けしたりユニコードエスケープされます。この対応は別途説明します。
型の変換例
- 各種の型をシリアライズした場合の出力例を次に記載します。(デシリアライズの場合は逆になります。)
これらは、既定の変換結果であり、別途説明するコンバータを使用することでカスタマイズできます。 - プロパティに指定できる型は、マイクロソフトのリファレンスのシリアル化の動作、逆シリアル化の動作をご覧ください。
- なお、サポートされない型を使用するとNotSupportedException例外がスローされます。
型 | サンプル値(C#表記) | 出力結果(シリアライズ結果) | 備考 |
---|---|---|---|
byte | 0x20 | 32 | |
byte[] | { 0x00, 0x01, 0x02, 0x03 } | "AAECAw==" | BASE64で符号化されて出力される |
char | (char)0x21 | “!” | |
char[] | { 'a', 'b', 'c' } | ["a", "b", "c"] | |
int | int.MinValue | -2147483648 | |
long | long.MaxValue | 9223372036854775807 | |
float | 0 | 0 | |
3.14F | 3.14 | ||
float.MaxValue | 3.4028235E+38 | ||
double | 0 | 0 | |
1000000.000D | 1000000 | ||
double.MinValue | -1.7976931348623157E+308 | ||
string | "123abc" | "123ABC" | |
"123\tabc\r\nABC" | "123\tabc\r\nABC" | ||
@"!""#$% &'()* +,-./ :;<=> ?@[\]^_`{| }~" | "!\u0022#$% \u0026\u0027()* \u002B,-./ :;\u003C=\u003E ?@[\\]^_\u0060{| }~" | 一部の記号はユニコードエスケープ、"\"のみ"\\"にエスケープ | |
bool | true | true | |
false | false | ||
列挙体 | Status.End | 2 | 列挙体の値が出力される |
リスト (IEnumerable) | new List<string>(){ "123", "abc" } | [ "123", "abc" ] | |
Dictionary | new Dictionary<string, int>(){ ["aaa"] = 1111, ["bbb"] = 2222 } | { "aaa": 1111, "bbb": 2222 } | Dictinary<T, V>のTはフィールドとして出力されるためstring型必須、Vは任意の型を指定可 |
リンク