C# PR

【C# Newtonsoft.Json】Dictionaryを使ったシリアライズ・デシリアライズの方法

記事内に商品プロモーションを含む場合があります

はじめに

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

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

公式サンプル

記事内で説明している内容は、公式サイトの以下のサンプルをベースにしています。

Json.NET公式 デシリアライズの例:

https://www.newtonsoft.com/json/help/html/DeserializeDictionary.htm

Json.NETの解説とインストール

Json.NETの紹介と、インストール方法については、以下の記事をご覧ください。

環境

この記事の内容は、以下の環境を使用しています。

環境 バージョンなど 備考
VisualStudio 2022 Community
.NET 4.8
プロジェクト C# コンソールプログラム (.NET Framework)
Json.net 13.0.3
OS Windows11 Win7・10でもOK

プログラム概要

今回解説するのプログラムの概要は以下の通りです。

  1. Dictionary型のデータを作成する。
  2. Dictionary型のデータを、JSONデータにシリアライズする。
  3. シリアライズしたJSONデータを出力する。
  4. JSONデータを生成する。
  5. JSONデータを、Dictionary型にデシリアライズする。
  6. デシリアライズしたDictonary型の各データを出力する。

実行結果

後述するのコードの実行結果は以下の通りです。

Dictionaryをシリアライズ・デシリアライズするプログラムの実行結果

全体のコード

「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です。

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

COMMENT

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

Index