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

C#

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;
        }

    }
}

おすすめ本 c#コードレシピ集

c#コードレシピ集は、「文字列を大文字あるいは小文字に変換したい」や「Taskをキャンセルしたい」など逆引き的にコードの書き方を調べられるレシピ集です。

2021年8月に発売された本で、全部で385個のレシピが収録されています。

ジャンルは日付処理やLINQ、並列処理と非同期処理など幅広く記載されています。

Kindle対応ですので、まずはサンプルをダウンロードして何が書かれているか確認してはいかがでしょうか。

コメント

タイトルとURLをコピーしました