[.NET Core] System.Text.JsonでDictionaryを使ってみる

.Net Frameworkから.NET Coreに移行した際に、System.Web.Script.Serializationが使えなくなりました。
.NET Core 3.0からJsonパーサが組み込まれたので、こちらに置き換えたときのメモです。

スポンサーリンク

オフィシャルの説明

Try the new System.Text.Json APIs – .NET BlogにJsonの説明があります。

書き換えた機能

辞書の中身をJsonにしてやりとりしてました。
複雑なデータを管理していたわけではないので、特に問題なく置き換えができました。

System.Text.Jsonを使ってみる

namespaceは以下のものを使用します。

using System.Text.Json;

シリアライズ

// 適当なDictionaryを生成します
var dic = new Dictionary<string, bool>()
{
    { "aaa", false },
    { "bbb", true },
    { "ccc", false }
};

// Dictionaryをシリアライズ
var jsonstr = JsonSerializer.Serialize(dic);
System.Diagnostics.Debug.Print("{0}", jsonstr);

// 出力
// {"aaa":false,"bbb":true,"ccc":false}

デシリアライズ

System.Text.Jsonではデシリアライズ時の型指定をしないとビルドが通りませんでした。
System.Web.Script.Serializationの場合がデシリアライズ時に型指定を行わなくても、読み取り時にdynamicで取得すると動かすことができました。

// デシリアライズしてDictionaryに戻します
var dictionary = new Dictionary<string, bool>();
var json = JsonSerializer.Deserialize<Dictionary<string, bool>>(jsonstr);
foreach (var item in json)
{
    dictionary[item.Key] = item.Value;
}

まとめ

Newtonsoft.JSONに特に不満はありませんでしたが、外部モジュールは少ない方が精神衛生的にはいいのでこちらに置き換えることになりそうです。
「System.Text.Jsonは速度が遅い」と話題にしている方がいましたが、データサイズが大きくないので私の環境では特に問題なかったです。
速度が重要なアプリの場合は、導入前に検討されるといいかと思います。

おしまい。

スポンサーリンク

.NET Core,C#,WPF.NET Core,C#,WPF

Posted by peliphilo