アプリ開発ときどきアウトドア

主にJavaを使ったアプリ開発やトラブルシューティング等のノウハウ、キャンプや登山の紹介や体験談など。

.NET Core 1. システムエンジニアリング 実装技術

.NET Core: JsonSerializerの単純な使い方

投稿日:2020年10月10日 更新日:

JsonSerializerの基本的な使い方とサンプルを説明します。

概要

使い方

クラス・プロパティをJSON文字列に変換する場合はJsonSerializer.Serialize()、逆にJSON文字列の内容をクラス・プロパティに変換する場合はJsonSerializer.Deserialize()を使用します。
変換対象となるクラス・プロパティの型によって、変換仕様が異なります。例えば、string型をシリアライズする場合は「”hello”」、intやlong型では「100, 1000」、bool型では「True/False」、がJSON文字列として出力されます。

// シリアライズ(クラス・プロパティ -> 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}");
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は任意の型を指定可


(adsbygoogle = window.adsbygoogle || []).push({});


(adsbygoogle = window.adsbygoogle || []).push({});

-.NET Core, 1. システムエンジニアリング, 実装技術

執筆者:

関連記事

mybatis-generatorプラグインの実装方法

mybatis-generatorを使うことで、各テーブルを操作するためのクラス群を容易に準備することができます。しかしながら、mybatis-generatorが提供する機能では、システム開発で求め …

.NET Core: Microsoft.Graph.Authの正式版予定

.NET CoreでMicrosoft Graphを操作するために、Microsoft Graph API SDK(“Microsoft.Graph”パッケージ)の使用を考えて …

パスワード情報の保管方式の比較

Webアプリの開発でパスワードを使ったユーザ認証を設計・実装する機会がよくある。 後輩への説明や勉強会ネタとして、この辺の話を纏めてみようと思う。 概要 オンラインバンキングやネットショッピングのサイ …

JBoss EAP7でDEBUG/TRACEログを出力

JBoss EAP7でアプリのDEBUGやTRACEのログを出力する方法を記載します。 開発の序盤でアプリのDEBUGログがeclipseのコンソールやログファイルに出力されず、困る場合があるので、メ …

mavenマルチモジュールプロジェクトの構成例

システム開発でよく使用するmavenマルチモジュールプロジェクトの構成サンプルを説明します。 構成方針 複数のサブシステムをもつシステム開発を想定しています。システム名はzzz、サブシステムはf10, …