この記事では、C# で JSON ファイルを読み込み(デシリアライズ)する方法を紹介します。
標準ライブラリと外部ライブラリのどちらかを選択して使う事になるのですが、この記事では豊富な機能と高パフォーマンスである「Newtonsoft.Json」という外部ライブラリを使います。
NuGet でダウンロードされた回数は26億回以上であり、その回数からも人気のライブラリであることが窺えます。
「JSON て何?」という初心者の方に向けて、記事の冒頭では JSON の特徴や書き方などをまとめていますので、ぜひ参考にしてみて下さい。
C#のオブジェクトをJSONへ変換したい方は次のリンクから確認ができます。
オススメの参考書
C#の使い方が丁寧に解説しており、「基礎からしっかりと学びたい」という初心者の方にオススメの一冊です。サンプルコードも記載してあり、各章の最後に復習問題があるので理解度を確認しながら読み進めることができます。新しい C# のバージョンにも対応している書籍です。
JSONファイルとは?
JSON ファイルとは記述形式が決められたテキストファイルのことです。
JSON(ジェイソン)は「JavaScript Object Notation」の略語で、JavaScript 用に開発された形式でシンプルな構造なのでデータが読みやすいという特徴があります。
JavaScript 以外の PHP や Ruby、Python などでも使用することができるため、プログラミング言語に依存しないという特徴があります。
- 読みやすいデータ形式である
- プログラミング言語に依存しない
- 不要なデータを含まないのでファイルが軽量である
JSON ファイルはシステムの設定ファイルや情報データを保存する時などでよく使われています。
JSONファイルの書き方
JSON ファイルの中身を確認することで、どんな書き方になっているか理解できます。例えば、Sample.json という JSON ファイルがあって、ファイルを開くと次のような形式になっていたとします。
{
"id": 1,
"name": "mitoma"
}
JSON は {} (波括弧)の中に「キー」と「値」を : (コロン)で区切って記述します。キーは必ず ” (ダブルクォーテーション)で囲む必要があります。例えば、入力ミスで ‘ (シングルクォーテーション)で囲ってしまうとエラーになります。
複数の「キー」と「値」を記述する場合は , (カンマ)で区切ります。この時、「キー」と「値」の組み合わせ毎に改行とインデントを使って整形することで読みやすくなります。
上記の例だと、id というキーに対する value が 1 で、name というキーに対する value が mitoma になります。シンプルな構造なので直観的に意味を理解しやすいですよね。
サポートしているデータ型
JSON は次のデータ型をわけて扱うことができます。
- 文字列
- 数値
- null
- bool値
- オブジェクト
- 配列
文字列型
文字列型は ” (ダブルクォーテーション)で括ります。日本語も文字列として扱うことができます。
{
"name": "mitoma",
"name": "三苫",
"url": "http:\/\/www.google.co.jp"
}
また、 ” (ダブルクォーテーション)や / (スラッシュ)を文字列として扱いたい場合は、スラッシュの前にエスケープ文字を記述します。
エスケープ表示 | 元の文字 | 説明 |
\” | “ | ダブルクォーテーション |
\\ | \ | バックスラッシュ |
\/ | / | スラッシュ |
\b | バックスペース | |
\f | 改ページ | |
\n | キャリジリターン(改行) | |
\r | ラインフィード | |
\t | タブ |
数値
数値は両サイドに引用符を付けずに、そのまま記述します。小数点も同様です。
{
"id": 1,
"pi": 3.14
}
null
null は全て小文字で記述します。null は空の状態を意味しており、キーに割り当てる値がない場合は、nullとして扱うことができます。
{
"id": null
}
bool値
bool (true または false)は両サイドに引用符を付けずに、そのまま記述します。
{
"flag1": true,
"flag2": false
}
オブジェクト
{} の中に更に {} を入れることができます。{} のデータ群のことをオブジェクトと言います。
{
"id": 1,
"name": "mitoma",
"attribute": {
"gender": "man",
"job": "soccer player"
}
}
配列
配列は [] を使います。配列内の要素は , (カンマ)で区切ることで複数の要素を入力することができます。
{
"id": 1,
"name": "mitoma",
"attribute": {
"gender": "man",
"job": "soccer player"
}
}
配列値は文字列、数値、オブジェクト、配列、ブール値、またはnullです。
JSON形式のチェックツール
JSON の形式で記述できているか確認するツールがあります。このツールを使うことで見た目を見やすくしたり、記述方法に誤りがないかをチェックすることが簡単に行えます。
ここでは、JSON Pretty Linter というツールを紹介します。
\ JSONのチェックツール /
整形前の枠内に JSON を貼り付けます。
構文チェックが「JSON is valid! (JSONは完璧です。)」が表示されれば記述に誤りがない事になります。
コピー用の枠内をクリックすると、整形後の JSON をコピーできます。
C#でJSONファイルを読み込む
C# で JSON を扱うために様々なライブラリが有りますが、この記事では「Newtonsoft.Json」というライブラリを使って読み込む方法を紹介します。
他のライブラリと比較して「デシリアライズ」と「シリアライズ」の処理速度が速く、高パフォーマンスという点が特徴です。
デシリアライズとは、ファイルに保存されている JSON をオブジェクトに変換することをと言います。シリアライズとは、オブジェクトを JSON に変換することを言います。
ここでは下記の JSON が保存されている Sample.json を読み込めるようにコードを書きます。JSON ファイルは実行ファイル(xxx.exe)があるディレクトリに保管しておきましょう。
{
"name": "Mitoma",
"age": 14,
"address": {
"country": "Japan",
"city": "Tokyo",
"streetAddress": "xx-xx-xx"
}
}
Newtonsoft.Jsonをインストールする
Visual Studio 上でソリューションエクスプローラーを開いて、[依存関係] -> [NuGetパッケージの管理] の順に選択をして NuGetパッケージ マネージャーを開きます。
ウィンドウの上部にある[参照]タブを選択(1)して、すぐ下にある検索ボックスに「Newtonsoft.Json」と入力して検索(2)します。
検索にヒットした候補から「Newtonsoft.Json」を選択(3)して、[インストール]ボタンをクリックして最新の安定版をインストール(4)します。
データ用のクラスを作成する
Newtonsoft.Json を使用するとクラスのデータを JSON フォーマットに変換したり、JSON フォーマットのデータをクラスに設定したりすることができます。
今回デシリアライズする JSON は、オブジェクトの中に更に別のオブジェクトを入れ子していますので、C#のクラスを2つ(Person、PersonAddress)定義します。
ここでクラスを作る時の注意点があります。
- クラスのフィールドはシリアライズ・デシリアライズの対象にならない。プロパティのみ対象になる。
- プロパティに属性がない場合は、プロパティの名前を JSON のキーと同じにしなければならない。
プロパティに属性を”付けない”、”付ける”は用途に合わせて選択してください。この記事では属性を付けないでデシリアライズの動作確認をしています。
プロパティに属性を付けない
Person クラスは name、age、address という名前でプロパティを作ります。PersonAddress クラスは country、city、streetAddressという名前でプロパティを作ります。
public class Person
{
public string name { get; set; }
public int age { get; set; }
public PersonAddress address { get; set; }
}
public class PersonAddress
{
public string country { get; set; }
public string city { get; set; }
public string streetAddress { get; set; }
}
プロパティに属性を付ける
プロパティの名前を JSON のキーと別名にしたい場合は、クラスのプロパティに属性[JsonProperty(“キーの名前”)]を付けます。
属性を付けずに JSON のキーと別名のプロパティに変えると、シリアライズまたはデシリアライズの時にエラーが発生します。
public class Person
{
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("age")]
public int Age { get; set; }
[JsonProperty("address")]
public PersonAddress Address { get; set; }
}
public class PersonAddress
{
[JsonProperty("country")]
public string Country { get; set; }
[JsonProperty("city")]
public string City { get; set; }
[JsonProperty("streetAddress")]
public string StreetAddress { get; set; }
}
他にも属性が用意されているので、興味がある方は公式ドキュメント(クラスの名前に”Attribute”が含まれているものが属性を意味する)を確認してみて下さい。
デシリアライズのクラスを作成する
JSON のデシリアライズを別のプロジェクトで再利用できるように、JSON の処理をまとめたクラス(JsonExtensions)を作成します。
このクラスのヘッダー部分に以下の using 宣言を追加します。
using Newtonsoft.Json;
Newtonsoft.Json のデシリアライズする関数(DeserializeObject)を使うことで簡単にデシリアライズできます。
JsonConvert.DeserializeObject<データ型>(JSONデータの文字列)
JSON データの文字列は StreamReader の ReadToEnd メソッドで読み込みした JSON の全ファイルデータになります。
public static class JsonExtensions
{
/// <summary>
/// JSONファイルからの読み込み
/// </summary>
/// <typeparam name="T">データ型</typeparam>
/// <param name="path">ファイルパス</param>
/// <returns></returns>
public static T? DeserializeFromFile<T>(string path)
{
if (File.Exists(path) is false) return default;
try
{
// JSONファイルを開く
using (var stream = new FileStream(path, FileMode.Open))
{
// JSONファイルを読み出す
using (var sr = new StreamReader(stream))
{
// デシリアライズオブジェクト関数に読み込んだデータを渡して、
// 指定されたデータ用のクラス型で値を返す。
return JsonConvert.DeserializeObject<T>(sr.ReadToEnd());
}
}
}
catch (Exception ex)
{
Debug.WriteLine($"failed:{ex.Message}");
return default;
}
}
}
ファイルをデシリアライズする
これで準備はできたので、さっそく使ってみましょう。
実行ファイルと同じディレクトリの Sample.json に保存されている JSON をオブジェクトに変換します。
using System.Windows;
using System.Diagnostics;
using static JsonSample.JsonExtensions;
namespace JsonSample
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var person = DeserializeFromFile("sample.json");
Debug.WriteLine($"NAME = {person.name}");
Debug.WriteLine($"AGE = {person.age}");
Debug.WriteLine($"COUNTRY = {person.address.country}");
Debug.WriteLine($"CITY = {person.address.city}");
Debug.WriteLine($"STREETADDRESS = {person.address.streetAddress}");
}
}
}
実行した結果は次のようになります。
NAME = Mitoma
AGE = 14
COUNTRY = Japan
CITY = Tokyo
STREETADDRESS = xx-xx-xx
まとめ
この記事では Newtonsoft.Json ライブラリを使って JSON ファイルをデシリアライズする方法を紹介しました。
JSON ファイルは軽量で読みやすい構造になっていることもあり、C#でも利用する機会があります。この記事が参考になれば幸いです。
以上、最後まで読んで頂きありがとうございました。