C#でJSONを部分的に読み込み・書き換え!初心者向け操作ガイド
生徒
「C#を使って、大きなJSONファイルの一部だけを読み取ったり、特定の場所だけ書き換えたりする方法はありますか?」
先生
「もちろんありますよ!C#ではSystem.Text.Jsonという機能を使って、JSONを自由自在に操作することができます。」
生徒
「全部読み込むのは大変そうですが、ピンポイントで変更できるなら便利そうですね。難しくないですか?」
先生
「最初は少しコツがいりますが、仕組みを理解すれば簡単です。プログラミングが初めての方でもわかるように、順を追って解説していきますね!」
1. JSONとは何かを学ぼう
プログラミングの世界では、データを保存したり、別のコンピュータへ送ったりする際に「特定の形式」で書く決まりがあります。その中でも世界中で最も使われている形式の一つがJSON(ジェイソン)です。JSONは「JavaScript Object Notation」の略ですが、中身はただのテキスト(文字)です。人間が見ても読みやすく、コンピュータも処理しやすいのが特徴です。
例えば、名前と年齢をJSONで表現すると以下のようになります。
{
"name": "田中太郎",
"age": 25
}
このように、波括弧の中に「キー(項目名)」と「値(中身)」をセットにして記述します。C#というプログラミング言語を使えば、この文字情報を読み取って計算に使ったり、逆にプログラムで作ったデータをJSONとして保存したりすることが可能です。
2. C#でJSONを扱うための準備
C#でJSONを操作するには、マイクロソフトが提供している標準のライブラリ(便利な道具箱のようなもの)を使用します。その名前はSystem.Text.Jsonです。最近のC#であれば、特別な設定をしなくても最初から使えるようになっています。
プログラムの冒頭で「これからこの道具箱を使いますよ」と宣言するために、using System.Text.Json;やusing System.Text.Json.Nodes;と記述します。これにより、複雑な処理を自分で一から書かなくても、便利な命令を呼び出すだけでJSONの操作ができるようになります。パソコンを触ったことがない方でも、この一文を書くことが第一歩だと覚えておきましょう。
3. JsonNodeを使って部分的に読み込む方法
JSON全体をクラス(データの型)に変換する方法もありますが、一部だけを知りたいときはJsonNode(ジェイソン・ノード)を使うのが非常に便利です。これは、JSONを家系図のような「ツリー構造」として扱う手法です。
特定のデータだけを抜き出すサンプルコードを見てみましょう。ここでは、ゲームのキャラクターデータの中から「レベル」だけを取得しています。
using System;
using System.Text.Json.Nodes;
class Program
{
static void Main()
{
// JSON形式の文字列
string jsonString = "{\"name\": \"勇者\", \"level\": 15, \"item\": \"伝説の剣\"}";
// 文字列をJsonNodeとして読み込む(パースする)
JsonNode root = JsonNode.Parse(jsonString);
// 「level」という項目だけを取り出す
int level = (int)root["level"];
Console.WriteLine("キャラクターのレベルは " + level + " です。");
}
}
実行結果は以下のようになります。
キャラクターのレベルは 15 です。
このように、root["項目名"]と書くだけで、欲しいデータに直接アクセスできます。これをパースと呼びます。パースとは、単なる文字列をプログラムが理解できるデータ構造に解析・変換することです。
4. JSONの値を書き換える手順
読み込みができるようになったら、次は中身を書き換えてみましょう。例えば、キャラクターがレベルアップしたときに、JSON内の数値を更新したい場合があります。JsonNodeを使えば、特定の項目に新しい値を代入するだけで簡単に書き換えが可能です。
using System;
using System.Text.Json.Nodes;
class Program
{
static void Main()
{
string jsonString = "{\"name\": \"魔法使い\", \"hp\": 50}";
JsonNode root = JsonNode.Parse(jsonString);
// hpの値を50から80に書き換える
root["hp"] = 80;
// 書き換えた結果を文字列として表示する
Console.WriteLine(root.ToJsonString());
}
}
実行結果は以下の通りです。
{"name":"魔法使い","hp":80}
元のデータは50でしたが、プログラムによって80に変更されました。ToJsonString()という命令を使うことで、メモリ上で書き換えたデータを再びJSON形式のテキストに戻すことができます。これをファイルに保存すれば、設定の変更などが完了します。
5. 新しい項目を追加したり削除したりする
既存の値を書き換えるだけでなく、新しい項目を付け足したり、不要な項目を消したりすることもできます。これはJsonObjectという型を利用するとスムーズです。例えば、ユーザー情報に「メールアドレス」という項目を追加したい場合や、パスワードのような機密情報を消したい場合に役立ちます。
using System;
using System.Text.Json.Nodes;
class Program
{
static void Main()
{
string jsonString = "{\"id\": 1, \"user\": \"admin\"}";
JsonObject obj = JsonNode.Parse(jsonString).AsObject();
// 新しい項目「status」を追加する
obj.Add("status", "active");
// 既存の項目「id」を削除する
obj.Remove("id");
Console.WriteLine(obj.ToJsonString());
}
}
実行結果は以下の通りです。
{"user":"admin","status":"active"}
Addは追加、Removeは削除という意味です。このように、C#では直感的な英語の命令を使ってJSONの形を自由に変えることができます。プログラミング未経験の方でも、この英単語の意味を知っていれば、何をしているのか想像しやすいはずです。
6. 複雑な階層構造(入れ子)の操作
実際のJSONはもっと複雑で、データの中にさらにデータが入っている入れ子構造(ネスト)になっていることがほとんどです。例えば「学校」の中に「クラス」があり、その中に「生徒」がいるような状態です。C#では、これらを階段を下りるように指定してアクセスします。
using System;
using System.Text.Json.Nodes;
class Program
{
static void Main()
{
string jsonString = "{\"school\": {\"name\": \"中央高校\", \"location\": \"東京\"}}";
JsonNode root = JsonNode.Parse(jsonString);
// schoolの中にあるlocationを書き換える
root["school"]["location"] = "大阪";
Console.WriteLine(root.ToJsonString());
}
}
実行結果は以下の通りです。
{"school":{"name":"中央高校","location":"大阪"}}
root["school"]["location"]のように、括弧を繋げて書くことで深い場所にあるデータもピンポイントで操作できます。これを「ドリルダウン」と呼ぶこともあります。深い階層でもやり方は変わらないので、一度覚えてしまえばどんなJSONでも怖くありません。
7. 配列データの読み込みと更新
JSONには「配列」という仕組みもあります。これは複数のデータを一列に並べたもので、[ ]という角括弧で囲まれます。例えば、買い物リストや複数のユーザー一覧などがこれに当たります。配列の中身を操作するときは、何番目のデータかを数字で指定します。プログラミングの世界では、数字は「0」から数え始めるのがルールです。
using System;
using System.Text.Json.Nodes;
class Program
{
static void Main()
{
// フルーツのリスト(配列)
string jsonString = "{\"fruits\": [\"りんご\", \"みかん\", \"ぶどう\"]}";
JsonNode root = JsonNode.Parse(jsonString);
// 0番目(最初)の「りんご」を「ばなな」に変更
root["fruits"][0] = "ばなな";
Console.WriteLine(root.ToJsonString());
}
}
実行結果は以下の通りです。
{"fruits":["ばなな","みかん","ぶどう"]}
配列の中身を書き換える際も、[0]や[1]といった番号(インデックス)を指定するだけでOKです。たくさんのデータが並んでいても、この番号さえわかれば特定の一箇所だけを修正することが可能です。
8. JSON操作で気をつけるべきポイント
JSONを操作するときに初心者がつまずきやすいポイントがいくつかあります。まず、JSONは大文字と小文字を区別するという点です。例えば「Name」と「name」は別の項目として扱われます。プログラムが動かないときは、スペルミスがないか、大文字小文字が合っているかを確認しましょう。
また、存在しない項目を読み取ろうとするとエラーが発生することがあります。安全にプログラムを動かすためには、その項目が本当に存在するかどうかを確認する処理を入れるのが理想的ですが、まずは「正確な名前でアクセスする」ことを心がけましょう。パソコン操作に慣れていない方は、項目名をコピーして貼り付けることで間違いを防ぐことができます。
9. 文字列をきれいに整形して表示する
これまでの例では、書き換えた後のJSONが一行でぎゅっと詰まって表示されていました。これはコンピュータにとっては読みやすいですが、人間にとっては少し見にくいです。C#では、人間が読みやすいように改行や空白を入れる「整形(インデント)」機能も備わっています。
JsonSerializerOptionsという設定用の道具を使うことで、見た目をきれいに整えることができます。開発中にデータの中身を目で見て確認したいときに非常に役立ちます。こうした細かいテクニックを知っておくと、プログラミングの作業効率がぐんと上がります。
10. JSONとXMLの違いを知っておこう
JSONと同じようにデータを扱う形式としてXML(エックスエムエル)というものもあります。XMLは<name>田中</name>のようにタグを使ってデータを囲む形式です。昔からよく使われている形式ですが、最近のウェブ開発やアプリ開発では、よりシンプルで文字数が少ないJSONが好まれる傾向にあります。
C#はどちらの形式も得意としていますが、まずは主流であるJSONの操作に慣れることをおすすめします。JSONの部分的な読み込みや書き換えができるようになれば、設定ファイルの作成、Web APIからのデータ取得、ゲームのセーブデータ管理など、作れるものの幅が一気に広がります。一つずつ試して、楽しみながら学んでいきましょう!