C#でJSONを変換!System.Text.Jsonによるシリアライズ・デシリアライズ完全解説
生徒
「C#でデータを保存したり、インターネットで送ったりするときにJSONというものを使うと聞いたのですが、どうやって操作すればいいですか?」
先生
「C#では、System.Text.Jsonという便利な機能を使って、プログラム上のデータをJSON形式に変換したり、逆に戻したりすることができますよ。」
生徒
「難しそうですね。シリアライズとかデシリアライズっていう言葉もよく分からなくて…。」
先生
「大丈夫です。料理のパック詰めと開封に例えると分かりやすいですよ。基本からゆっくり解説していきますね!」
1. JSONとは何かを学ぼう
プログラミングの世界では、データをやり取りするための共通のルールが必要です。その中でも世界中で最も使われている形式の一つがJSON(ジェイソン)です。JSONは「JavaScript Object Notation」の略ですが、C#を始めとする多くの言語で利用されています。
JSONの特徴は、人間が見ても内容が分かりやすく、コンピュータにとっても扱いやすいテキスト形式であることです。例えば、名前や年齢といった情報を、特定の記号を使って整理して書き込みます。パソコンの初心者の方でも、メモ帳で書いたテキストファイルのようなものだと想像すれば分かりやすいでしょう。
C#でこのJSONを扱うためには、標準で用意されているSystem.Text.Jsonという機能を利用します。これを使うことで、複雑な変換処理を自分で一から書く必要がなくなり、安全かつ高速にデータを操作できるようになります。
2. シリアライズとデシリアライズの言葉の意味
JSONを扱う際によく出てくる用語に「シリアライズ」と「デシリアライズ」があります。これらは横文字で難しく聞こえますが、意味はとてもシンプルです。
シリアライズとは、プログラムの中で動いている「データのかたまり(オブジェクト)」を、保存や送信ができるように「テキストデータ」に変換することです。これを料理に例えると、作った料理をパックに詰めて出荷できる状態にすることだと言えます。
一方でデシリアライズは、その逆の操作です。受け取った「テキストデータ」を、再びプログラムで計算や表示ができる「データのかたまり」に戻すことを指します。これは、パック詰めされた料理を開封して、お皿に盛り付けて食べられる状態にすることと同じです。
この二つの言葉を覚えるだけで、エンジニア同士の会話がぐっと理解しやすくなります。C#のプログラムを書くときは、このパック詰めと開封の作業を命令として記述していくことになります。
3. クラスというデータの設計図を作ろう
C#でJSONを扱う第一歩は、データの「入れ物」を定義することです。これをクラスと呼びます。クラスは、例えば「学生情報」であれば「名前」「出席番号」「点数」といった項目をまとめた設計図のようなものです。
JSONに変換したい項目には、C#のプロパティという仕組みを使います。このとき、項目の名前をJSONと一致させておくことが重要です。まずは、最もシンプルな自己紹介データを扱うためのクラスを作成してみましょう。以下のコードは、名前と年齢を保持する設計図です。
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
ここで出てくるstringは文字を表し、intは整数を表します。これらを組み合わせて、一つのまとまったデータ構造を作ります。この設計図があることで、コンピュータは「このデータには名前と年齢が入っているんだな」と理解できるようになります。
4. データをJSONに変換するシリアライズの実装
それでは、実際にC#のデータをJSON形式の文字列に変換してみましょう。これにはJsonSerializer.Serializeという命令を使います。この一文字の命令で、内部の複雑な処理がすべて自動で行われます。
以下のサンプルプログラムでは、先ほど作ったPersonクラスのデータを作成し、それをJSON形式のテキストとして画面に表示します。プログラムがデータをテキストに書き換えていく様子を確認してください。
using System;
using System.Text.Json;
public class Program
{
public static void Main()
{
// データの作成(料理を作る)
Person person = new Person
{
Name = "田中太郎",
Age = 25
};
// シリアライズ(パック詰め)
string jsonString = JsonSerializer.Serialize(person);
// 結果を表示
Console.WriteLine("変換されたJSON:");
Console.WriteLine(jsonString);
}
}
実行結果は以下のようになります。データが波括弧で囲まれ、項目名と値がペアになって並んでいることが分かります。
変換されたJSON:
{"Name":"\u7530\u4E2D\u592A\u90CE","Age":25}
日本語が少し変な記号に見えるかもしれませんが、これはコンピュータが読みやすいようにエンコード(変換)された状態です。設定次第で、人間にも読みやすい日本語として出力することも可能です。
5. JSONを読み込んで元のデータに戻すデシリアライズ
次に、テキスト形式のJSONを読み込んで、再びC#のクラス形式に戻す「デシリアライズ」を試してみましょう。これにはJsonSerializer.Deserializeという命令を使います。
この機能は、インターネットから取得したデータや、ファイルに保存しておいた設定情報を読み出すときに非常に重宝します。テキストデータが、魔法のようにプログラムで扱える変数へと姿を変えます。
using System;
using System.Text.Json;
public class Program
{
public static void Main()
{
// JSON形式のテキスト(パック詰めされた状態)
string jsonInput = "{\"Name\":\"佐藤花子\",\"Age\":30}";
// デシリアライズ(開封して盛り付け)
Person person = JsonSerializer.Deserialize<Person>(jsonInput);
// 中身を取り出して表示
Console.WriteLine($"名前: {person.Name}");
Console.WriteLine($"年齢: {person.Age}");
}
}
実行結果は以下の通りです。テキストの中から、名前と年齢が正しく抽出されています。
名前: 佐藤花子
Age: 30
このように、デシリアライズを使うことで、外部のデータを自分のプログラムの一部として自然に扱えるようになります。初心者の方は、まずこの「Serialize」と「Deserialize」という二つの単語をセットで覚えることから始めましょう。
6. 見やすく表示するためのオプション設定
先ほどの実行結果では、JSONが一列に繋がっていて、人間にとっては少し読みづらいものでした。開発中に中身を確認したいときは、改行やスペースを入れて綺麗に整列させたいことがあります。これを「整形」や「プリティプリント」と呼びます。
System.Text.Jsonでは、JsonSerializerOptionsというクラスを使って、変換時の細かいルールを指定できます。例えばWriteIndentedという設定を「true(有効)」にすると、人間にとって非常に読みやすい形式で出力されます。
using System;
using System.Text.Json;
public class Program
{
public static void Main()
{
var product = new { Id = 101, Name = "ノートパソコン", Price = 85000 };
// オプションの設定
var options = new JsonSerializerOptions
{
WriteIndented = true // 改行して見やすくする
};
string prettyJson = JsonSerializer.Serialize(product, options);
Console.WriteLine(prettyJson);
}
}
実行結果は以下のようになります。階層構造が分かりやすくなりましたね。
{
"Id": 101,
"Name": "\u30CE\u30FC\u30C8\u30D1\u30BD\u30B3\u30F3",
"Price": 85000
}
このように設定を変更することで、プログラムの動作をカスタマイズできるのもC#の強みです。初心者の方は、まずはこの「見た目を整える」という基本のオプションから触ってみるのがおすすめです。
7. リストや配列をJSONにする方法
これまでは一つのデータだけを扱ってきましたが、実際のアプリ開発では、複数のデータ(リスト)をまとめてJSONにしたい場面が多いです。例えば、「商品一覧」や「ユーザーリスト」などです。
C#のListという機能を使うと、同じ種類のデータをたくさん並べて保持できます。System.Text.Jsonはこのリスト形式にも完全に対応しており、一括でシリアライズやデシリアライズを行うことが可能です。
using System;
using System.Collections.Generic;
using System.Text.Json;
public class Program
{
public static void Main()
{
// データのリストを作成
List<string> fruits = new List<string> { "りんご", "みかん", "ぶどう" };
// リスト全体をJSONに変換
string jsonList = JsonSerializer.Serialize(fruits);
Console.WriteLine("フルーツのリスト:");
Console.WriteLine(jsonList);
}
}
実行結果は以下のようになります。角括弧で囲まれているのがリスト形式のJSONの特徴です。
フルーツのリスト:
["\u308A\u3093\u3054","\u307F\u304B\u3093","\u3076\u3069\u3046"]
複雑なデータ構造になっても、基本的な使い方は変わりません。大きなデータの塊も、一つの命令で簡単にテキストに変換できるのが、このライブラリの非常に便利な点です。
8. エラーを防ぐための注意点と大文字小文字の区別
JSONを扱う際に初心者が一番つまづきやすいポイントは、「名前の不一致」です。C#ではプロパティの名前を大文字で始めることが多いですが、JSONでは小文字で書かれていることが多々あります。
標準の設定では、名前が完全に一致していないと正しくデシリアライズ(読み込み)ができません。例えば、C#側が「Name」で、JSON側が「name」だと、データが空っぽになってしまうことがあります。これを防ぐには、PropertyNameCaseInsensitiveという設定を有効にします。
「CaseInsensitive」とは「大文字と小文字を区別しない」という意味です。この設定をオンにしておくことで、多少の表記の揺れがあっても柔軟にデータを読み込んでくれるようになり、エラーに強いプログラムになります。安全に開発を進めるための大切な知恵です。
9. 実際のアプリでの活用イメージ
ここまでの知識を使って、どんなことができるようになるのか想像してみましょう。例えば、スマホゲームのセーブデータ。プレイヤーのレベルや所持金をJSONにしてファイルに保存すれば、次回起動時にそのデータを読み込んで再開できます。
また、お天気アプリ。インターネット上のサーバーから最新の天気をJSON形式で受け取り、それをデシリアライズして画面に「晴れ」と表示します。私たちが普段使っているアプリの裏側では、必ずと言っていいほどこのJSONの技術が使われています。
難しい理屈をすべて理解する必要はありません。まずは「クラスを作って、Serializeで保存し、Deserializeで読み出す」というこの流れを体験することが、C#マスターへの近道となります。一つずつ、自分の手でコードを書いて動かしてみましょう。