JSON

Dictionaryのシリアライズ・デシリアライズを分かりやすく解説【C# Json.NET】

はじめに

C#で人気のライブラリ、NewtonSoft Json.NETで、Dictionaryを使ってシリアライズ・デシリアライズを行う方法を解説します。

Dictionaryを使うことで、「データ用クラスを作成せずに」JSONデータのシリアライズ・デシリアライズをすることができます。「文字列:文字列」「文字列:数値」など、シンプルなペアで構成されたJSONデータを扱う際におすすめの方法です。

記事内で説明している内容は、公式サイトの
シリアライズのページデシリアライズのページをベースにしています。

「Json.NETってそもそも何?」という方は、以下の短い記事をご覧ください。


Json.NETのインストール方法についてはこちらの記事をご覧ください。

環境

この記事の内容は、以下の環境で作成しています。

環境バージョンなど備考
VisualStudio   2019 Community 2017でも使用できます
.NET4.7.2
プロジェクトコンソール(.NET Framework) 
Json.NET12.0.3
OSWindows10

実行結果

後述する「Dictionaryを使ったシリアライズ・デシリアライズ」のコードの実行結果は以下の通りです。

上の段は、Dictonaryのデータを、JSON形式の文字列にシリアライズした結果です。
文字列をそのままファイルに書き込むことで、JSONファイルを作成できます。

下の段はコード内のJSON形式の文字列を、Dictionaryにデシリアライズした結果です。
JSONデータの各データ名称を、そのままDictionaryの要素名として使用することができます。

Dictionaryを使ったシリアライズ・デシリアライズのコードの実行結果

全体のコード

「Dictionaryを使ったシリアライズ・デシリアライズ」のコードは以下の通りです。
ポイントとなる部分を「コードのポイント」で詳細に解説します。

 System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json; // Json.netを使うのに必要です。

namespace ConsoleAppJsonDictionary
{
    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();
        }
    }
}

コードのポイント

Dictionaryのシリアライズ

以下の一行で完了します。今回はDictionaryを使用していますが、自作のデータクラス渡してシリアライズすることもできます。

// DictionaryをJSONデータにシリアライズします
 string json = JsonConvert.SerializeObject(points, Formatting.Indented);

引数でのインデントの指定


1つ目の引数には、シリアライズするクラスの変数を指定しています。
2つ目の引数には、インデントの有無を指定します。種類は以下の2つのみです。

インデントなしFormatting.None
インデントありFromatting.Indented

Dictionaryのデシリアライズ

デシリアライズも以下の一行で完了します。
デシリアライズするDictionaryの型 (今回はStringのペア)とJSON形式の文字列を渡します。代入側にも同じ型を指定してください。

// JSONデータからDictionaryにデシリアライズします
Dictionary<string, string> htmlAttributes = JsonConvert.DeserializeObject<Dictionary<string, string>>(json2);

Dictionaryへのアクセス

デシリアライズにより、Dictionaryに「JSONと同じ変数名の要素」が生成されるため、JSONの変数名(コロンの左側)をそのまま使用してデータにアクセスすることができます。

            // href の中身を出力します
            Console.WriteLine("hrefのデータ内容  : " + htmlAttributes["href"]);

まとめ

C#で人気のライブラリ、NewtonSoft Json.NETを使って、データ用クラスを使わずに、DictionaryにJSONデータをシリアライズ・デシリアライズする方法を紹介しました。参考になればうれしいです。

C#がよく分からないんだけど…という方へ

「プログラミングを初めてみたい」「専門書を読んだけど分からなかった」という方に以下の書籍をオススメします。

「知識ゼロから始める人」「一度挫折した経験がある人」向けに書かれた「とても分かりやすい」というレビューが多い一冊です。

超初心者~中級の内容を「利用頻度の高いものに絞って」解説していて、時間のない人でも効率的に学習することができます。

高額なことが多い専門書の中でもコスパのいい本なので、ぜひこの本で「C#のライブラリをスラスラ使いこなせる自分」を目指してみてください。

もっと詳しくJson.NETを知る

このブログでは、Json.NETの他の使い方についても解説しています。よろしければ以下の記事もご覧ください。

JSONの読み込み・デシリアライズ

JSONのシリアライズ・ファイル書き込み

JObjectを使用したパース

JSONデータと違う名前をメンバ変数につける方法

応援・要望お待ちしてます

ブログを見ていて「この辺を詳しく知りたい」「このライブラリの使い方を知りたい」「こんなことで困ってる」...etc があれば、コメント・問い合わせ・Twitterで教えてください。質問・ご要望に合わせて解説記事を作ります。

ブログを気に入っていただけたり、「応援してもいいよ」という方がいたら、ブログやSNSでの紹介をお願いします。 あたたかい応援は、中の人の更新の大きな励みになります。

ABOUT ME
えす
現役のソフトウェアエンジニアです。 C++ C# Python を使ってます。10年ちょい設計/開発部門にいましたが、今はQAエンジニアっぽいことをしています。

COMMENT

メールアドレスが公開されることはありません。