はじめに
C#で人気のライブラリ、NewtonSoft Json.NETのJObjectを使って、JSONファイルのパースを行う方法を簡単なイメージ図を使って解説します。
以前の記事では、JSONをファイルから読み込んだ後、独自のデータクラスや、Dictionary型にデシリアライズする方法を解説しました。今回はJSONをパース後、デシリアライズなしで「JObject」や「JArray」に変換する方法を公式サンプルをベースに解説します。
LINQに対応しているので、LINQの構文を使って要素にアクセスすることもできます。
- 自作データクラスを作らずにJSONからデータを取得する
- 大きなJSONデータから、一部のデータだけ取得する
JSon.NETのインストール方法についてはこちらの記事をご覧ください。
デシリアライズってどうやるの?という方は以下をご覧ください。
環境
この記事の環境は以下で作成・動作確認しています。
環境 | バージョンなど | 備考 |
VisualStudio | 2019 Community | 2017でも使用できます |
.NET | 4.7.2 | |
プロジェクト | コンソールアプリケーション (.NET Framework) | |
Json.net | 13.0.1 |
Nugetでのインストール方法
Json.NETのインストール方法については、こちらの記事で、画像付きの詳細に解説しています。
ベースにした公式サンプル
この記事は、公式サンプルのこのページをベースにしています。
実行結果
後述するコードの実行結果は以下の通りです。
全体コード
前述した、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 ConsoleAppJsonParse
{
class Program
{
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();
}
}
}
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ファイルのパースを行う方法を解説しました。
お知らせ
\ C#でFormアプリを作りたい方へ /
「もっとFormアプリの作ってみたい」という方には、こちらの本をおすすめします。
「買ってきた素材(Controll)をそのまま並べる」「簡単な手順(コード)で作る」など、作るコードの内容がイメージしやすく、実行画面を見た上で話が進むため「最終的に何ができるのか?」イメージしつつ、ストレスなく読み進むことができます。
イラスト多めなので、文字が苦手な方も安心です。

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