C# PR

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データをシリアライズ・デシリアライズする方法を紹介しました。参考になればうれしいです。

お知らせ

今月号の『Software Design』はドメイン駆動設計(DDD)。実例を交えたDDDの手法の解説が特集されています。

編集:Software Design 編集部
¥1,562 (2024/03/13 12:59時点 | Amazon調べ)
\楽天ポイント4倍セール!/
楽天市場

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

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

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

JObjectを使用したパース

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

質問・要望 大歓迎です

「こんな解説記事作って」「こんなことがしたいけど、〇〇で困ってる」など、コメント欄で教えてください。 質問・要望に、中の人ができる限り対応します。

使えたよ・設定できたよの一言コメントも大歓迎。気軽に足跡を残してみてください。記事を紹介したい方はブログ、SNSにバシバシ貼ってもらってOKです。

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

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です