はじめに
NewtonSoft Json.NETで、Dictionaryを使ってシリアライズ・デシリアライズを行う方法を解説します。
Dictionaryを使うことで、「データ用クラスを作成せずに」JSONデータのシリアライズ・デシリアライズをすることができます。「文字列:文字列」「文字列:数値」など、シンプルなペアで構成されたJSONデータを扱う際におすすめの方法です。
~ この記事の内容 / Contents ~
公式サンプル
記事内で説明している内容は、公式サイトの以下のサンプルをベースにしています。
Json.NETの解説とインストール
Json.NETの紹介と、インストール方法については、以下の記事をご覧ください。
環境
この記事の内容は、以下の環境を使用しています。
環境 | バージョンなど | 備考 |
VisualStudio | 2022 Community | |
.NET | 4.8 | |
プロジェクト | C# コンソールプログラム (.NET Framework) | |
Json.net | 13.0.3 | |
OS | Windows11 | Win7・10でもOK |
プログラム概要
今回解説するのプログラムの概要は以下の通りです。
- Dictionary型のデータを作成する。
- Dictionary型のデータを、JSONデータにシリアライズする。
- シリアライズしたJSONデータを出力する。
- JSONデータを生成する。
- JSONデータを、Dictionary型にデシリアライズする。
- デシリアライズしたDictonary型の各データを出力する。
実行結果
後述するのコードの実行結果は以下の通りです。
全体のコード
「Dictionaryを使ったシリアライズ・デシリアライズ」のコードは以下の通りです。
ポイントとなる部分を「コードのポイント」で詳細に解説します。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json; // Json.net用に追加します
namespace ConsoleApp1
{
internal class Program
{
static void Main(string[] args)
{
//
// Dictionary --> JSONデータへのシリアライズ
//
// Dictionary型の変数を作成します
Dictionary<string, int> points = new Dictionary<string, int>
{
{ "James", 9001 },
{ "Jo" , 3474 },
{ "Jess" , 11926 }
};
// DictionaryをJSONデータにシリアライズします
string json = JsonConvert.SerializeObject(points, Formatting.Indented);
// JSONデータを出力します
Console.WriteLine("--- DictonaryからJSONデータにシリアラライズしたデータの表示です ---");
Console.WriteLine(json + "\n");
// JSONデータ --> Dictionaryへのデシリアライズ
//
// JSONフォーマットの文字列を作成します
// (サンプルから json2 に名前を変えています)
string json2 = @"{
'href' : '/account/login.aspx',
'target': '_blank'
}";
// JSONデータからDictionaryにデシリアライズします
Dictionary<string, string> htmlAttributes = JsonConvert.DeserializeObject<Dictionary<string, string>>(json2);
// Dictionaryに格納後の内容を出力します。
Console.WriteLine("--- JSONデータからDictonaryに変換したデータの表示です ---\n");
// href の中身を出力します
Console.WriteLine("hrefのデータ内容 : " + htmlAttributes["href"]);
// target の中身を出力します
Console.WriteLine("targetのデータ内容: " + htmlAttributes["target"]);
Console.WriteLine("\n何かキーを押すと終了します");
Console.ReadKey();
}
}
}
ビルド/実行前に、Json.NETのインストールが必要です。インストール方法はこちらの記事を参照してください。
プロジェクト名(Nanespace)はデフォルトの「ConsoleApp1」で作成しています。
コードのポイント
Dictionaryのシリアライズ
デシリアライズは以下の一行で完了します。今回はDictionaryを使用していますが、自作のデータクラス渡してシリアライズすることもできます。
// DictionaryをJSONデータにシリアライズします
string json = JsonConvert.SerializeObject(points, Formatting.Indented);
引数でのインデントの指定
SerializeObjectの関数では、2つ目の引数で、JSONデータの「インデントの有無」を指定できます。種類は以下の2つのみです。
インデントなし | Formatting.None |
インデントあり | Fromatting.Indented |
Dictionaryのデシリアライズ
デシリアライズも以下の一行で完了します。
引数には、デシリアライズするDictionaryの型 (今回はStringのペア)と、JSONデータが入った文字列を渡します。
Dictionaryの型は、代入側にも同じ形式のものを指定してください。
// JSONデータからDictionaryにデシリアライズします
Dictionary<string, string> htmlAttributes = JsonConvert.DeserializeObject<Dictionary<string, string>>(json2);
Dictionaryへのアクセス
デシリアライズにより、Dictionaryに「JSON変数と同じ名前の要素」が生成されます。
そのため、アクセスする際は、JSON変数名(コロンの左側)をそのまま要素名に指定してデーアクセスしてください。
// href の中身を出力します
Console.WriteLine("hrefのデータ内容 : " + htmlAttributes["href"]);
まとめ
NewtonSoft Json.NETを使って、データ用クラスを使わずに、DictionaryにJSONデータをシリアライズ・デシリアライズする方法を紹介しました。
参考になればうれしいです。
お知らせ
今月号のSoftware Designは「もっとTypeScriptの力を引き出そう」
JavaScriptの拡張言語でしょ?と思っているかたへ、Union型などTypeScriptの持つ秘めたる力を解説する特集となっています。
個人的には第2特集の「Ubuntuの現代的な使い方」がの方が気になりました。より詳しい内容は以下のリンクからご覧ください。
もっと詳しくJson.NETを知る
このブログでは、Json.NETの他の使い方についても解説しています。よろしければ以下の記事もご覧ください。
JSONの読み込み・デシリアライズ
JObjectを使用したパース
JSONデータと違う名前をメンバ変数につける方法
質問・要望 大歓迎です
「こんな解説記事作って」「こんなことがしたいけど、〇〇で困ってる」など、コメント欄で教えてください。 質問・要望に、中の人ができる限り対応します。
使えたよ・設定できたよの一言コメントも大歓迎。気軽に足跡を残してみてください。記事を紹介したい方はブログ、SNSにバシバシ貼ってもらってOKです。