JSON はアプリケーションの設定値を保存する際に使われたり、近年ではネットワーク上でデータの受け渡しを行う際にも使われているデータ形式の1つです。
JSON を扱う C# のライブラリの中で人気なのが「Newtonsoft.Json」です。NuGet からインストールする事ができて、他のライブラリと比較して豊富な機能と高パフォーマンスを有しています。
この記事では「Newtonsoft.Json」を使って JSON 形式のデータをファイルへ書き込み(シリアライズ)する方法を紹介します。
記事の冒頭では JSON の特徴や書き方などをまとめていますので、ぜひ参考にしてみて下さい。
JSON ファイルをC#で読み込みたい方は次のリンクから確認ができます。
オススメの参考書
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をファイルへ書き込む
「Newtonsoft.Json」は他のライブラリと比較して「デシリアライズ」と「シリアライズ」の処理速度が速く、高パフォーマンスという点が特徴です。
- デシリアライズとは、JSON をオブジェクトに変換すること。
- シリアライズとは、オブジェクトを JSON に変換すること。
ここでは C# のオブジェクトをシリアライズした JSON を Sample.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 のシリアライズする関数(SerializeObject)を使うことで簡単にシリアライズできます。
JsonConvert.SerializeObjec(データ用クラスのオブジェクト, インデント方式)
インデント方式はインデント有りの「Formatting.None」とインデント無しの「Formatting.Indented」の2種類があります。基本的にファイルのデータを閲覧した際に読みやすくなるようインデントは有りにしておきましょう。
public static class JsonExtensions
{
/// <summary>
/// Jsonファイルへの出力
/// </summary>
/// <typeparam name="T">データ型</typeparam>
/// <param name="obj">オブジェクト</param>
/// <param name="path">ファイルパス</param>
public static void SerializeToFile<T>(this T obj, string path)
{
try
{
using (var sw = new StreamWriter(path, false, System.Text.Encoding.UTF8))
{
// JSON データにシリアライズ
var jsonData = JsonConvert.SerializeObject(obj, Formatting.Indented);
// JSON データをファイルに書き込み
sw.Write(jsonData);
}
}
catch (Exception ex)
{
Debug.WriteLine($"failed:{ex.Message}");
}
}
}
シリアライズしてファイル保存する
これで準備はできたので、さっそく使ってみましょう。
C#で作成したデータ用クラスのオブジェクトを JSON に変換して、実行ファイルと同じディレクトリに Sample.json という名前でファイルへ保存します。
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var person = new Person
{
Name = "Mitoma",
Age = 14,
Address = new PersonAddress
{
Country = "Japan",
City = "Tokyo",
StreetAddress = "xx-xx-xx"
}
};
person.SerializeToFile("sample.json");
}
}
実行した結果、Sample.json という名前で次のようなデータが保存されます。
{
"name": "Mitoma",
"age": 14,
"address": {
"country": "Japan",
"city": "Tokyo",
"streetAddress": "xx-xx-xx"
}
}
まとめ
この記事では Newtonsoft.Json ライブラリを使って C# のデータ用クラスのオブジェクトをシリアライズする方法を紹介しました。
JSON ファイルは軽量で読みやすい構造になっていることもあり、C#でも利用する機会があります。この記事が参考になれば幸いです。
以上、最後まで読んで頂きありがとうございました。