はじめに
C#で人気のライブラリ、NewtonSoft Json.NETのJObjectを使って、JSONファイルのパースを行う方法を簡単なイメージ図を使って解説します。
以前の記事では、JSONをファイルから読み込んだ後、独自のデータクラスや、Dictionary型にデシリアライズする方法を解説しました。今回はJSONをパース後、デシリアライズなしで「JObject」や「JArray」に変換する方法を公式サンプルをベースに解説します。
LINQに対応しているので、LINQの構文を使って要素にアクセスすることもできます。
~ この記事の内容 / Contents ~
- 自作データクラスを作らずにJSONからデータを取得する
- 大きなJSONデータから、一部のデータだけ取得する
JSon.NETのインストール方法についてはこちらの記事をご覧ください。
環境
この記事では以下の環境を使用しています。
環境 | バージョンなど | 備考 |
VisualStudio | 2022 Community | |
.NET | 4.8 | |
プロジェクト | C# コンソールプログラム (.NET Framework) | |
Json.net | 13.0.3 | |
OS | Windows11 | Win7/10でもOK |
ベースにした公式サンプル
この記事は、公式サンプルのこのページをベースにしています。
実行結果
後述するコードの実行結果は以下の通りです。
全体コード
前述した、JOjectを使ってパースを行うコードは以下の通りです。
下記のようにJObjectを使えば、「大きなJSONデータから一部のデータだけ取得する」「データクラスを作成せずに取得する」といったことが出来るようになります。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// JObjectを使用するのに必要です
using Newtonsoft.Json.Linq;
namespace ConsoleApp1
{
//
// デシリアライズ用のデータクラスです
//
public class Account
{
public string Email { get; set; }
public bool Active { get; set; }
public DateTime CreatedDate { get; set; }
public IList<string> Roles { get; set; }
}
internal class Program
{
//
// 注意:
// Cドライブの直下に、test.jsonのファイルが保存済みであることを前提にしています。
//
static void Main(string[] args)
{
// パースするJSON形式の文字列です
string json = @"{
CPU: 'Intel',
Drives: [
'DVD read/writer',
'500 gigabyte hard drive'
]
}";
// JObjectにパースします
JObject o = JObject.Parse(json);
// CPUの要素名でアクセスします
string cpu = o["CPU"].ToString();
// Drivesの値に直接アクセスします
// JValueからStringに変換しています
string drive_dvd = o["Drives"][0].ToString();
string drive_500 = o["Drives"]
.ToString();
// 取得した文字列の表示です
Console.WriteLine("cpu: " + cpu);
Console.WriteLine("[Drives][0]: " + drive_dvd);
Console.WriteLine("[Drives]
: " + drive_500);
// 見やすさのための改行です
Console.WriteLine("");
// 要素をJArray型にキャストして使用します
JArray jArray = (JArray)o["Drives"];
// JValueからStringに変換しています
string drive1 = jArray[0].ToString();
string drive2 = jArray
.ToString();
// JArray取得した文字列の表示です
Console.WriteLine("Array[0]: " + drive1);
Console.WriteLine("Array
: " + drive2);
// 終了待機です
Console.ReadKey();
}
}
}
実行前にJson.NETのインストールが必要です。インストール方法はこちらの記事を参照してください。
プロジェクト名(Nanespace)はデフォルトの「ConsoleApp1」で作成しています。
JObjectの基礎知識
Json.netでは、JSONのデータを扱う各種クラスを「JToken」という基底(ベース)クラスから派生(継承)させています。
JObjectについても、内部で色々な型を持てるように、データを上記の「JToken」で保持しています。
そのため、JObjectの内部のデータを使用する際は、キャストやtoString()などで、JTokenを使いたい型に変換してから使用します。(C++でいうと、ベースクラスからアップキャストです)
コードのポイント
JSONデータの読み取り
JObject.Parse() でJSONデータををJObjectに変換しています。
Linqに対応しているので、Dictionaryのように「Key – Value」のペアで扱うことや、Select等のLINQ文を使うことができます。
// JObjectにパースします
JObject o = JObject.Parse(json);
JSONの文字列型へのアクセス
「CPU」の値部分にアクセスするために、JObjectの要素名に「”CPU”」を指定しています。
// CPUの要素名でアクセスします
string cpu = o["CPU"].ToString();
そのまま変数に代入したいところですが、「CPU」のようにKeyに対して、Valueが一意に決まる形式は、Valueの部分が「JValue」という型になります。そのため、Value部分をToString() で文字列型に変換してから代入します。
JSONの配列型へのアクセス
「Drives」はJSONの配列型のため、Value部分が複数存在しています。
そのため、Keyに「Drives」と指定した後、Valueの”何番目か?” をインデックスで指定する必要があります。
さらに、インデックスで指定した内部データは「JToken型」なので、文字列に代入するためにToString()で変換を行っています。
// パースするJSON形式の文字列です
string json = @"{
CPU: 'Intel',
Drives: [
'DVD read/writer',
'500 gigabyte hard drive'
]
}";
// ~~~ 省略 ~~~
// Drivesの値に直接アクセスします
// JValueからStringに変換しています
string drive_dvd = o["Drives"][0].ToString();
string drive_500 = o["Drives"]
.ToString();
JArrayを取得する
前述したコードでは、JObjectに対して o[“Drives”][0]のように直接アクセスして使用していましたが、JObject内部では、「Drives」はJArray型(にキャスト可能なJToken型)で保持されています。
そのため、「Drives」を「JArray」にキャストすることで、JArray型の変数に代入することができます。
// "Drives"の中身は配列なので、JArray型にキャストして代入します
JArray jArray = (JArray)o["Drives"];
// JArrayから文字列を指定しています。
string drive1 = jArray[0].ToString();
string drive2 = jArray
.ToString();
まとめ
C#で人気のライブラリ、NewtonSoft Json.NETのJObjectを使って、JSONファイルのパースを行う方法を解説しました。
お知らせ
今月号のSoftware Designは「もっとTypeScriptの力を引き出そう」
JavaScriptの拡張言語でしょ?と思っているかたへ、Union型などTypeScriptの持つ秘めたる力を解説する特集となっています。
個人的には第2特集の「Ubuntuの現代的な使い方」がの方が気になりました。より詳しい内容は以下のリンクからご覧ください。

Json.NETを詳しく知りたい
このブログではJson.NETの他の使い方についても解説しています。興味のある方は以下の記事もご覧ください。
データクラスを使って読み込み・シリアライズをする方法
質問・要望 大歓迎です
「こんな解説記事作って」「こんなことがしたいけど、〇〇で困ってる」など、コメント欄で教えてください。 質問・要望に、中の人ができる限り対応します。
使えたよ・設定できたよの一言コメントも大歓迎。気軽に足跡を残してみてください。記事を紹介したい方はブログ、SNSにバシバシ貼ってもらってOKです。