C#でNewtonsoft.Jsonを使いこなす!初心者向けJSON操作とデシリアライズ完全解説
生徒
「C#でWebサイトのデータや設定ファイルを扱いたいのですが、JSONという言葉をよく耳にします。これは一体何ですか?」
先生
「JSONは、データを保存したり交換したりするための世界共通の書き方のルールです。C#ではNewtonsoft.Jsonという便利な道具を使うことで、驚くほど簡単に扱えるようになりますよ。」
生徒
「初心者でも、複雑なデータをプログラムで読み書きできるようになりますか?」
先生
「もちろんです!まずは基本から、少し高度なテクニックまで順番に解説していきますね。」
1. JSONとNewtonsoft.Jsonの基礎知識
プログラミングの世界では、情報を整理して保存しておく必要があります。その際に最もよく使われる形式がJSON(ジェイソン)です。JSONは「JavaScript Object Notation」の略称ですが、JavaScriptだけでなく、C#やPythonなど、あらゆるプログラミング言語で利用されています。
JSONの特徴は、人間が見ても内容が理解しやすく、コンピュータにとっても処理が簡単であるという点です。例えば、名前や年齢、趣味といった情報を、波括弧や鍵括弧を使って整理します。しかし、C#でこのJSONをそのまま扱おうとすると、少し手間がかかります。そこで登場するのが、Newtonsoft.Json(ニュートンソフト・ジェイソン)というライブラリです。別名「Json.NET」とも呼ばれ、世界中のC#開発者に愛用されている非常に強力なツールです。
このライブラリを使う最大のメリットは、シリアライズとデシリアライズが非常に簡単にできることです。シリアライズとは、C#で作ったオブジェクト(データのかたまり)をJSON形式の文字列に変換すること。逆にデシリアライズとは、JSON形式の文字列をC#で扱えるオブジェクトに戻すことを指します。この二つの言葉は、これからプログラミングを学ぶ上で何度も出てくる重要な用語なので、ぜひ覚えておきましょう。
2. Newtonsoft.Jsonの導入方法
Newtonsoft.Jsonは、C#の標準機能ではなく、外部の拡張機能として提供されています。これを使うためには、NuGet(ニューゲット)という仕組みを利用します。NuGetは、便利なプログラムの部品を簡単に自分のプロジェクトに取り込める「道具箱」のようなものです。
Visual Studioを使用している場合、「ソリューションのNuGetパッケージの管理」から「Newtonsoft.Json」を検索してインストールするだけで準備完了です。インストールが終わったら、プログラムの冒頭にusing Newtonsoft.Json;と記述することで、その魔法のような機能が使えるようになります。パソコンを触ったことがない方にとっては「インストール」と聞くと難しく感じるかもしれませんが、スマホでアプリを入れるのと同じくらい簡単な操作ですので安心してください。
3. オブジェクトをJSONに変換するシリアライズ
まずは、C#で作ったデータをJSON形式に変えてみましょう。これをシリアライズと呼びます。例えば、ゲームのプレイヤー情報を保存したい場合を考えてみます。名前、レベル、所持金といったデータを持つ「クラス」という設計図を作り、それをJSONに変換します。
using System;
using Newtonsoft.Json;
public class Player
{
public string Name { get; set; }
public int Level { get; set; }
public int Gold { get; set; }
}
class Program
{
static void Main()
{
// プレイヤーのデータを作成
Player hero = new Player { Name = "勇者", Level = 10, Gold = 500 };
// C#のオブジェクトをJSON文字列に変換
string json = JsonConvert.SerializeObject(hero);
Console.WriteLine("変換されたJSONデータ:");
Console.WriteLine(json);
}
}
上記のコードを実行すると、次のような結果が表示されます。
{"Name":"勇者","Level":10,"Gold":500}
JsonConvert.SerializeObjectという命令一回だけで、複雑なデータが一行のテキストにまとまりました。これがシリアライズの力です。これならファイルに保存したり、インターネットを通じて誰かに送ったりするのも簡単ですね。
4. JSONをオブジェクトに戻すデシリアライズ
次に、保存されたJSONデータを再びC#のオブジェクトとして読み込む方法を見ていきましょう。これをデシリアライズと呼びます。外部から受け取ったデータや、ファイルから読み込んだ設定情報をプログラムで活用するために不可欠な操作です。
using System;
using Newtonsoft.Json;
class Program
{
static void Main()
{
// JSON形式の文字列(データ)
string jsonInput = "{\"Name\":\"魔法使い\",\"Level\":15,\"Gold\":1200}";
// JSON文字列をPlayerオブジェクトに変換
Player loadedPlayer = JsonConvert.DeserializeObject<Player>(jsonInput);
Console.WriteLine("読み込まれたデータ:");
Console.WriteLine("名前:" + loadedPlayer.Name);
Console.WriteLine("レベル:" + loadedPlayer.Level);
Console.WriteLine("所持金:" + loadedPlayer.Gold);
}
}
public class Player
{
public string Name { get; set; }
public int Level { get; set; }
public int Gold { get; set; }
}
実行結果は以下の通りです。
読み込まれたデータ:
名前:魔法使い
レベル:15
所持金:1200
JsonConvert.DeserializeObject<型名>と書くことで、テキストデータが自動的に指定した形式のデータに組み立て直されます。プログラムの中では、普通の変数と同じように名前やレベルを取り出して使うことができるようになります。
5. リストや配列をJSONで扱う方法
現実のプログラムでは、データは一つだけではなく、複数をまとめて扱いたいことが多々あります。例えば「お店の商品リスト」や「友達の連絡先一覧」などです。C#のList(リスト)という機能を使って、複数のデータをまとめてJSONにしてみましょう。
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
public class Item
{
public string ItemName { get; set; }
public int Price { get; set; }
}
class Program
{
static void Main()
{
List<Item> shopList = new List<Item>
{
new Item { ItemName = "やくそう", Price = 8 },
new Item { ItemName = "どくけしそう", Price = 10 },
new Item { ItemName = "せいすい", Price = 20 }
};
// リスト全体をJSONに変換
string jsonList = JsonConvert.SerializeObject(shopList, Formatting.Indented);
Console.WriteLine("商品リストのJSON:");
Console.WriteLine(jsonList);
}
}
ここで注目してほしいのが、Formatting.Indentedというオプションです。これをつけると、人間が見やすいように改行やスペースを入れて整形してくれます。
[
{
"ItemName": "やくそう",
"Price": 8
},
{
"ItemName": "どくけしそう",
"Price": 10
},
{
"ItemName": "せいすい",
"Price": 20
}
]
このように、複数のデータは角括弧 [ ] で囲まれて出力されます。Newtonsoft.Jsonを使えば、リストの中にさらにリストがあるような複雑な構造でも、自動的に正しいJSON形式にしてくれます。
6. 特定の項目だけを変換の対象にするテクニック
高度な操作として、「特定のデータだけはJSONにしたくない」という場合があります。例えば、ユーザーのパスワードや、計算にしか使わない一時的な数値などです。このようなときは、JsonProperty属性やJsonIgnore属性を使います。
using System;
using Newtonsoft.Json;
public class UserAccount
{
// JSONでの名前を「user_id」に変更する
[JsonProperty("user_id")]
public string UserId { get; set; }
// この項目はJSONに含めない
[JsonIgnore]
public string InternalPassword { get; set; }
public string Nickname { get; set; }
}
class Program
{
static void Main()
{
UserAccount myAcc = new UserAccount
{
UserId = "ID12345",
InternalPassword = "secret_password",
Nickname = "たろう"
};
string json = JsonConvert.SerializeObject(myAcc);
Console.WriteLine(json);
}
}
実行結果は以下のようになります。
{"user_id":"ID12345","Nickname":"たろう"}
InternalPasswordは表示されず、UserIdは指定した通りuser_idという名前に変わっています。このように属性(アトリビュート)を使うことで、C#側の設計とJSON側の形式を柔軟に使い分けることができます。これはWeb開発などで、相手が指定したデータ形式に合わせる必要があるときに非常に役立つテクニックです。
7. 動的なJSON操作とJObjectの活用
これまでは、あらかじめ「クラス」というデータの型を用意していましたが、時には「どんな形のデータが来るかわからない」という状況もあります。そんな時に便利なのがJObjectというクラスです。これを使うと、辞書(ディクショナリ)のように自由自在にJSONの内容を書き換えたり、一部分だけを抽出したりできます。
例えば、巨大なJSONの中から特定の「天気」という項目だけを取り出したい場合、わざわざ全ての項目に対応するクラスを作るのは大変です。JObjectを使えば、ピンポイントでデータにアクセスできます。また、実行中に新しい項目を追加することも可能です。これは「動的(ダイナミック)」な操作と呼ばれ、プログラムの柔軟性を大幅に高めてくれます。
未経験の方には少し難しく感じるかもしれませんが、「設計図がなくてもその場でデータをいじれる便利な道具があるんだな」程度に考えておけば大丈夫です。まずは基本的なシリアライズとデシリアライズをマスターし、慣れてきたらこのJObjectに挑戦してみるのが上達への近道です。C#のNewtonsoft.Jsonは、初心者からプロフェッショナルまで、どんなニーズにも応えてくれる頼もしい存在なのです。