JSON

【2021年版 Json.NET】JSONの読み込み・デシリアライズを分かりやすく解説【C# json】

はじめに

C#で人気のライブラリ、NewtonSoft Json.NETを使って、JSONファイルの読み込みと、デシリアライズをする方法を解説します。

※ 2021/05/14
  検索して来てくれた方々すみません。手違いで記事が非公開状態になっていました。復旧しました。

この記事の内容
  • JSONデータの読み取り
  • JSONデータのデシリアライズ
この記事の対象読者
  • JSONの読み取り・デシリアライズの方法が知りたい
  • 公式サイトは英語でよく分からない
  • サクッとピンポイントな内容だけ知りたい

記事内で説明している内容は、公式サイトのこのページをベースにしています。
Json.NETってそもそも何?という方は、以下の短い記事をご覧ください。

ポイントとなるコード

先にポイントとなるコードを説明して、最後に全体のコードを説明します。
この記事では以下の環境を使用しています。

  • C# コンソールプログラム
  • .NET 4.7.2
  • Json.net v12.0.3

JSONファイルの読み込み

ファイルの読み込みは、テキストファイルの場合と同じです。
StreamReaderでファイルをOPENするだけで完了します。

using (StreamReader file = File.OpenText(@"C:\test.json") )
 {
         // この中で、読み込んだファイルを処理します。
 }

デシリアライズ

上のコードのusingの中で、Json.netのオブジェクト(クラスの変数) 「serializer」 を作成します。

その後、「serializer」のDeserialize関数に、ファイルを読み込んだStreamReaderと、デシリアライズするクラス名(型名)を渡すだけです。デシリアライズは2行で完了します。


using (StreamReader file = File.OpenText(@"C:\test.json") )
{
         // Json.netのオブジェクトを作成します
         JsonSerializer serializer = new JsonSerializer();

          // デシリアライズ関数に
          // 読み込んだファイルと、データ用クラスの名称(型)を指定します。
          // 
          // デシリアライズされたデータは、自動的にaccountの
          // 各メンバ変数に格納されます 
          //
         account = (Account)serializer.Deserialize(file, typeof(Account));
 }

全体コード

全体コードは以下の通りです。上で説明したコードに、以下の内容をを追加しています。
クラス定義とusing以外はVisualStudioが自動生成したコードを使えばOKです。

  • デシリアライズに使用する「Account」クラスの定義
  • デシリアライズ後のメンバ変数の表示処理
  • 冒頭のusingの追加
  • try-catch処理、終了待ち処理。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;                  // ファイル読み込みに必要です
using Newtonsoft.Json;         // Json.net用に必要です

namespace ConsoleApp_testJsonNet
{

    //
    // デシリアライズ用のデータクラスです
    //
    public class Account
    {
        public string Email { get; set; }
        public bool Active { get; set; }
        public DateTime CreatedDate { get; set; }
        public IList<string> Roles { get; set; }
    }

    class Program
    {
        //
        // 注意:
        // Cドライブの直下に、test.jsonのファイルが保存済みであることを前提にしています。
        //

        static void Main(string[] args)
        {
            // デシリアライズしたデータを入れる、入れ物です
            Account account = null;

            try
            {
                //
                // jsonファイルを読み込みます
                //
                using (StreamReader file = File.OpenText(@"C:\test.json") )
                {
                    // Json.netのオブジェクトを作成します
                    JsonSerializer serializer = new JsonSerializer();

                    // デシリアライズ関数に
                    // 読み込んだファイルと、データ用クラスの名称(型)を指定します。
                    // 
                    // デシリアライズされたデータは、自動的にaccountの
                    // メンバ変数に格納されます 
                    //
                    account = (Account)serializer.Deserialize(file, typeof(Account));
                }

                // 表示してみます
                Console.WriteLine("Email : " + account.Email);
                Console.WriteLine("Active: " + account.Active);
                Console.WriteLine("Date  : " + account.CreatedDate);

                foreach( string role in account.Roles)
                {
                    Console.WriteLine("Roles : " + role);
                }

            }

            catch
            {
                Console.WriteLine("ファイル読み込み時に例外が発生しました。");
            }

            Console.WriteLine("キーを押すと終了します");
            Console.ReadKey();

        }
    }
}

実行の前にJSONファイルの配置

コードを実行する前に、Cドライブ直下に以下のJSONファイルを置いてください。
ここに記載された内容が、プログラム実行によりデータクラスのメンバ変数に格納されます。

{
  'Email': 'james@example.com',
  'Active': true,
  'CreatedDate': '2013-01-20T00:00:00Z',
  'Roles': [
    'User',
    'Admin'
  ]
}

実行結果

JSONファイルに記載された内容が、上記の簡単なコードだけでAccountクラスのオブジェクト(変数)に格納できました。

まとめ

C#で人気のライブラリ、NewtonSoft Json.NETで、JSON形式のデータの読み取り・デシリアライズする方法を解説しました。参考になればうれしいです。

シリアライズやファイル出力方法も知りたい!」という方や、「Dictionaryを使う方法が知りたい!」という方は、合わせて以下の記事もご覧ください。

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

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

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

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

COMMENT

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