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対応ですので、まずはサンプルをダウンロードして何が書かれているか確認してはいかがでしょうか。
コメント