C#でJSON操作をマスター!JsonSerializerの使い方を初心者向けに徹底解説
生徒
「C#でデータを保存したり、別のプログラムに送ったりしたいのですが、JSONという言葉をよく聞きます。これは何のことですか?」
先生
「JSONは、データをテキスト形式で表現するための世界共通のルールのことです。C#ではJsonSerializerという機能を使うと、プログラム上のデータを簡単にJSONに変えたり、元に戻したりできますよ。」
生徒
「難しそうに見えますが、初心者でも使えますか?」
先生
「もちろんです!まずはデータの入れ物を作ることから始めて、一歩ずつ進めていきましょう。」
1. JSONとは何かをイメージで理解しよう
プログラミングの世界では、情報を整理して管理する必要があります。例えば、ある人の「名前」や「年齢」という情報を保存したいとき、どのような形式で書けばコンピューターが理解しやすいでしょうか。そこで登場するのがJSON(ジェイソン)です。
JSONは「JavaScript Object Notation」の略ですが、名前を覚える必要はありません。イメージとしては、「ラベル付きの箱」が並んでいる状態だと考えてください。例えば、名前が田中さんで年齢が20歳なら、{ "Name": "田中", "Age": 20 } という風に、名前と値をセットにして記述します。この形式は人間が見ても読みやすく、コンピューターにとっても扱いやすいため、現代のシステム開発では欠かせない技術となっています。
C#というプログラミング言語を使ってこのJSONを扱う場合、標準で用意されているSystem.Text.Jsonというライブラリ(便利な道具箱のようなもの)を使用するのが一般的です。これを使うことで、複雑な記述を自分で書かなくても、自動的に変換を行ってくれます。
2. シリアル化とデシリアル化という言葉の解説
JSON操作を学ぶ上で必ず出てくるのが「シリアル化」と「デシリアル化」という少し難しい言葉です。パソコンに詳しくない方でもわかるように、料理に例えて説明します。
シリアル化(シリアライズ)とは、プログラムの中で動いているデータ(料理)を、保存や送信ができるようにテキスト形式(レシピ)に変換することを指します。C#の中にあるオブジェクトという実体を、JSONという文字列に変換する作業です。
反対に、デシリアル化(デシリアライズ)とは、テキスト形式(レシピ)を読み込んで、再びプログラムの中で使えるデータ(料理)として復元することを指します。外部から受け取ったJSON文字列を、C#のクラスという設計図に当てはめて、プログラムが操作できる形に戻す作業です。
この二つの操作を自由自在に扱えるようになると、アプリの設定をファイルに保存したり、インターネットを通じて情報をやり取りしたりすることが可能になります。
3. データの設計図「クラス」を作成する
C#でJSONを扱うには、まず「どんなデータを扱うか」という設計図を作る必要があります。これをクラスと呼びます。クラスは、情報の項目を定義したテンプレートのようなものです。
例えば、商品の情報を扱うプログラムを作るとしましょう。商品には「名前」と「価格」という項目が必要です。これをC#のコードで書くと以下のようになります。まずは基本となるデータの形を定義してみましょう。
public class Product
{
// 商品の名前を入れるための項目
public string Name { get; set; }
// 商品の価格を入れるための項目
public int Price { get; set; }
}
ここで出てくる public は「どこからでも使える」という意味、string は「文字」、int は「整数」を扱うための決まり文句です。この設計図があるおかげで、C#は「Nameという項目には文字が入り、Priceという項目には数字が入るんだな」と理解できるのです。
4. JsonSerializerでデータをJSONに変換する(シリアル化)
設計図ができたら、次は実際にデータを入れて、それをJSON形式の文字列に変換してみましょう。ここで使うのが JsonSerializer.Serialize という命令です。この一行を書くだけで、C#の複雑なデータが瞬時にテキストへと姿を変えます。
以下のコードは、先ほど作った「商品」の設計図に具体的な値(リンゴ、100円)を入れて、JSONに変換する例です。プログラムを動かす際は、ファイルの先頭に using System.Text.Json; と書くことを忘れないでください。これは「JSON操作の道具を使いますよ」という宣言です。
using System;
using System.Text.Json;
public class Program
{
public static void Main()
{
// 1. 商品データを作成する
Product myProduct = new Product
{
Name = "リンゴ",
Price = 100
};
// 2. C#のデータをJSON文字列に変換(シリアル化)
string jsonString = JsonSerializer.Serialize(myProduct);
// 3. 画面に表示して確認
Console.WriteLine(jsonString);
}
}
public class Product
{
public string Name { get; set; }
public int Price { get; set; }
}
このプログラムを実行すると、以下のような結果が表示されます。
{"Name":"リンゴ","Price":100}
このように、波括弧で囲まれ、項目名と値がペアになった文字列が生成されます。これがJSONの正体です。
5. JSONを読み込んでデータに戻す方法(デシリアル化)
今度は逆に、JSON形式のテキストを読み込んで、C#のプログラムで計算や表示ができるように戻してみましょう。これには JsonSerializer.Deserialize という命令を使います。例えば、Webサイトから送られてきたデータや、ファイルに保存しておいたデータを読み出すときに使います。
デシリアル化を行うときは、どの設計図(クラス)に当てはめるかを指定する必要があります。以下の例では、文字列として用意したJSONデータを、再び Product クラスの形に復元しています。
using System;
using System.Text.Json;
public class Program
{
public static void Main()
{
// 1. JSON形式のテキストを用意
string jsonInput = "{\"Name\":\"オレンジ\",\"Price\":150}";
// 2. JSON文字列をC#のオブジェクトに変換(デシリアル化)
Product loadedProduct = JsonSerializer.Deserialize<Product>(jsonInput);
// 3. 復元されたデータを使ってみる
Console.WriteLine("商品名: " + loadedProduct.Name);
Console.WriteLine("価格: " + loadedProduct.Price + "円");
}
}
public class Product
{
public string Name { get; set; }
public int Price { get; set; }
}
実行結果は以下のようになります。テキストだったデータが、プログラムで自由に扱える形式に戻っていることがわかります。
商品名: オレンジ
価格: 150円
6. 日本語が文字化けしないように設定する方法
標準の JsonSerializer.Serialize をそのまま使うと、日本語(ひらがなや漢字)が「\u3042」のような特殊な記号(Unicodeエスケープ)に変換されてしまうことがあります。これはコンピューターが確実にデータを伝えるための仕組みですが、人間が見るには不便です。
日本語をそのままの見た目で出力したい場合は、オプション設定を追加します。JsonSerializerOptions というクラスを使い、エンコーダーを指定することで解決できます。少し呪文のように見えるかもしれませんが、定型文として覚えておくと便利です。
using System;
using System.Text.Json;
using System.Text.Encodings.Web;
using System.Text.Unicode;
public class Program
{
public static void Main()
{
var person = new { Name = "佐藤", Message = "こんにちは" };
// 日本語をエスケープせずに表示するための設定
var options = new JsonSerializerOptions
{
Encoder = JavaScriptEncoder.Create(UnicodeRanges.All),
WriteIndented = true // 見やすく改行を入れる設定
};
string json = JsonSerializer.Serialize(person, options);
Console.WriteLine(json);
}
}
この設定を行うことで、出力結果は以下のようになります。WriteIndented = true を加えたことで、改行が入って非常に読みやすくなっています。
{
"Name": "佐藤",
"Message": "こんにちは"
}
7. リストや配列をJSONにする方法
実際の開発では、一つのデータだけでなく、複数のデータをまとめて扱いたい場面が多くあります。C#では List という機能を使って複数のデータをひとまとめにできますが、これらもまとめてJSONに変換することが可能です。
例えば、複数の学生の成績データをまとめて保存したい場合を考えてみましょう。個別のデータをリストに追加していき、そのリスト全体をシリアル化するだけです。特別なループ処理などを自分で書く必要はありません。
using System;
using System.Collections.Generic;
using System.Text.Json;
public class Student
{
public string Name { get; set; }
public int Score { get; set; }
}
public class Program
{
public static void Main()
{
// 学生のリストを作成
List<Student> students = new List<Student>
{
new Student { Name = "田中", Score = 85 },
new Student { Name = "鈴木", Score = 92 },
new Student { Name = "伊藤", Score = 78 }
};
// リスト全体をJSONに変換
string json = JsonSerializer.Serialize(students);
Console.WriteLine(json);
}
}
このように実行すると、全体が角括弧 [] で囲まれた形式で出力されます。これはJSONにおいて「配列(データの集まり)」を意味します。
[{"Name":"田中","Score":85},{"Name":"鈴木","Score":92},{"Name":"伊藤","Score":78}]
8. JSON操作でよくある失敗と注意点
初心者がJSON操作でつまずきやすいポイントをいくつか紹介します。まず一つ目は、クラスのプロパティ(項目)に public を付け忘れることです。JsonSerializer は、公開されている項目しか見ることができません。非公開(private)になっていると、無視されてしまうので注意しましょう。
二つ目は、項目の名前が一致していないことです。JSONの中にある名前と、C#のクラスで定義した名前が異なると、デシリアル化(読み込み)のときにデータがうまく入りません。大文字と小文字も区別されるため、正確に合わせる必要があります。もし名前を変えたい場合は [JsonPropertyName("名前")] という属性を使って紐付けを行う方法もあります。
三つ目は、データの型が合っていない場合です。数字が入るべき場所に文字が入っているJSONを読み込もうとすると、エラーが発生してプログラムが止まってしまいます。データをやり取りする相手と、どのような形式にするかを事前にしっかり決めておくことが大切です。これらの基本を押さえておけば、JSON操作で困ることは格段に減るはずです。