【超簡単】c#でJSONを読み書きする方法

c#でJSONファイルに変換したり、JSONファイルを読み込む方法について紹介したいと思います。

使用するアセンブリ

この記事では System.Text.Json を使用しています。

そのため、ソースコードの先頭に以下を記述します。

using System.Text.Json;

クラスオブジェクトをJSONに変換する

以下のようなクラスがあったとします。

    class Data {
        public int id {get; set;}
        public string name {get; set;}
        public string dept { get; set;}
    }

このクラスに値をセットして、JSONに出力するソースコードは以下になります。

    static void JsonSer()
    {
        Data data = new Data();

        data.id = 1;
        data.name = "john";
        data.dept = "Purchase";

        string jsonStr = JsonSerializer.Serialize(data);
        Console.WriteLine(jsonStr);

    }

Dataクラスを dataとしてオブジェクトを作成して、値をセットします。

    Data data = new Data();

    data.id = 1;
    data.name = "john";
    data.dept = "Purchase";

シリアライズ(JSON形式に変換)し、string型変数に格納します。

    string jsonStr = JsonSerializer.Serialize(data);

以下のように出力されれば、成功です。

{"id":1,"name":"john","dept":"Purchase"}

配列のクラスオブジェクトをJSONに変換する

配列オブジェクトも簡単にシリアライズできます。

    static void JsonSerArray()
    {
        Data[] data = new Data[3];

        data[0] = new Data();
        data[0].id = 1;
        data[0].name = "john";
        data[0].dept = "Purchase";

        data[1] = new Data();
        data[1].id = 2;
        data[1].name = "Mickey";
        data[1].dept = "Sales";

        data[2] = new Data();
        data[2].id = 3;
        data[2].name = "Donald";
        data[2].dept = "Planning";

        string jsonStr = JsonSerializer.Serialize(data);
        Console.WriteLine(jsonStr);

    }

以下のように出力されれば、成功です。

[{"id":1,"name":"john","dept":"Purchase"},{"id":2,"name":"Mickey","dept":"Sales"},{"id":3,"name":"Donald","dept":"Planning"}]

JSONを読み込み、クラスオブジェクトに格納する方法

今度は逆にJSONをファイルから読み込み、クラスオブジェクトに格納してみます。

    static void readJson()
    {

        string jsonStr = ReadAllLine("jsonStr.json", "utf-8");

        Data jsonData = new Data();
        jsonData = JsonSerializer.Deserialize<Data>(jsonStr);

        Console.WriteLine($"jsonData.id = {jsonData.id}");
        Console.WriteLine($"jsonData.name = {jsonData.name}");
        Console.WriteLine($"jsonData.dept = {jsonData.dept}");

    }

読み込むファイルjsonStr.jsonの中身は、以下のとおりです。

{"id":1,"name":"john","dept":"Purchase"}

ReadAllLine関数は、ファイルを全行読み込む処理を行います。

        public static string ReadAllLine(string filePath, string encodingName)
        {
            StreamReader sr = new StreamReader(filePath, Encoding.GetEncoding(encodingName));
            string allLine = sr.ReadToEnd();
            sr.Close();

            return allLine;
        }

JSONデータを読み込み(デシリアライズ)するには、JsonSerializer.Deserialize<T>を使用します。

    jsonData = JsonSerializer.Deserialize<Data>(jsonStr);

以下のように標準出力に出力されれば成功です。

jsonData.id = 1
jsonData.name = john
jsonData.dept = Purchase

配列型JSONを読み込み、クラスオブジェクトに格納する方法

今度は配列型のJSONをデシリアライズしてみます。

        static void readJsonArray()
        {

            string jsonStr = ReadAllLine("jsonStrArray.json", "utf-8");
            Console.WriteLine(jsonStr);

            Data[] jsonData = new Data[3];
            jsonData = JsonSerializer.Deserialize<Data[]>(jsonStr);

            foreach(Data item in jsonData)
            {
                Console.WriteLine($"jsonData.id = {item.id}");
                Console.WriteLine($"jsonData.name = {item.name}");
                Console.WriteLine($"jsonData.dept = {item.dept}");
            }

        }

読み込むファイルjsonStrArray.jsonの中身は以下のとおりです。

[{"id":1,"name":"john","dept":"Purchase"},{"id":2,"name":"Mickey","dept":"Sales"},{"id":3,"name":"Donald","dept":"Planning"}]

このデータは配列要素が3つありますので、Dataクラスオブジェクトを要素3の配列として定義します。

    Data[] jsonData = new Data[3];

デシリアライズする際の型はData[]になります。

    jsonData = JsonSerializer.Deserialize<Data[]>(jsonStr);

以下のように出力されれば成功です。

jsonData.id = 1
jsonData.name = john
jsonData.dept = Purchase
jsonData.id = 2
jsonData.name = Mickey
jsonData.dept = Sales
jsonData.id = 3
jsonData.name = Donald
jsonData.dept = Planning

ソースコード全文

この記事を書くにあたって使用したソースコードの全文を記載します。

using System;
using System.Text.Json;
using System.IO;
using System.Text;


namespace csjson
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            readJsonArray();
        }

        class Data {
            public int id {get; set;}
            public string name {get; set;}
            public string dept { get; set;}
        }

        static void JsonSer()
        {
            Data data = new Data();

            data.id = 1;
            data.name = "john";
            data.dept = "Purchase";

            string jsonStr = JsonSerializer.Serialize(data);
            Console.WriteLine(jsonStr);
            writeFile("utf-8", "jsonStr.json", jsonStr);

        }

        static void JsonSerArray()
        {
            Data[] data = new Data[3];

            data[0] = new Data();
            data[0].id = 1;
            data[0].name = "john";
            data[0].dept = "Purchase";

            data[1] = new Data();
            data[1].id = 2;
            data[1].name = "Mickey";
            data[1].dept = "Sales";

            data[2] = new Data();
            data[2].id = 3;
            data[2].name = "Donald";
            data[2].dept = "Planning";

            string jsonStr = JsonSerializer.Serialize(data);
            Console.WriteLine(jsonStr);
            writeFile("utf-8", "jsonStrArray.json", jsonStr);

        }

        static void readJson()
        {

            string jsonStr = ReadAllLine("jsonStr.json", "utf-8");
            Console.WriteLine(jsonStr);

            Data jsonData = new Data();
            jsonData = JsonSerializer.Deserialize<Data>(jsonStr);

            Console.WriteLine($"jsonData.id = {jsonData.id}");
            Console.WriteLine($"jsonData.name = {jsonData.name}");
            Console.WriteLine($"jsonData.dept = {jsonData.dept}");

        }



        static void readJsonArray()
        {

            string jsonStr = ReadAllLine("jsonStrArray.json", "utf-8");
            Console.WriteLine(jsonStr);

            Data[] jsonData = new Data[3];
            jsonData = JsonSerializer.Deserialize<Data[]>(jsonStr);

            foreach(Data item in jsonData)
            {
                Console.WriteLine($"jsonData.id = {item.id}");
                Console.WriteLine($"jsonData.name = {item.name}");
                Console.WriteLine($"jsonData.dept = {item.dept}");
            }

        }





        public static void writeFile(string encodingName, string filePath, string writeText)
        {

            Encoding encoding = Encoding.GetEncoding(encodingName);
            StreamWriter writer = new StreamWriter(filePath, false, encoding);
            writer.WriteLine(writeText);

            writer.Close();

        }

        public static string ReadAllLine(string filePath, string encodingName)
        {
            StreamReader sr = new StreamReader(filePath, Encoding.GetEncoding(encodingName));
            string allLine = sr.ReadToEnd();
            sr.Close();

            return allLine;
        }


    }
}

速攻でメモできる QuickNote リリースしました!

QuickNoteは動作が超軽量でサクサクかけるノートアプリです。一瞬の閃きを逃さずにノートを開き書き始めることができます。 アカウント登録も不要です。お試しあれ!

Excel操作をコマンドで! proBoarderExcel

Excelはマウスで操作するのが基本ですが、マウス操作に疲れてはいませんか? キーボードでExcel操作ができるようになるアプリです。オープンソースで無料です。

積み上げ! Daily Stack リリースしました!

Daily Stack は日々の積み上げを管理するToDoアプリです。過去の積み上げの振り返りだけでなく、ツイート機能もあります。 アカウント登録不要ですぐに使い始めることができます。

ExecNote.app リリースしました!

ExecNoteは、コードが実行できるMarkdownアプリケーションです。Markdownドキュメント内に記載したコードをクリックすると実行ができます。わざわざターミナルを 起動させる必要がありません!無料ですのでもしよければダウンロードをお願いします。

About Me

11年目のシステムエンジニアです。アプリで生活や仕事を改善したい🐱仕事効率化、自動化のアプリ開発が得意です、ご相談ください。 🚀エンタメ系アプリの開発も模索中🐬社内SEや個人アプリ開発者、システムエンジニアになりたい人と繋がりたい🐱