JSON

JObjectでパースをする方法 【C# Json.NET】

はじめに

C#で人気のライブラリ、NewtonSoft Json.NETのJObjectを使って、JSONファイルのパースを行う方法を簡単なイメージ図を使って解説します。

以前の記事では、JSONをファイルから読み込んだ後、独自のデータクラスや、Dictionary型にデシリアライズする方法を解説しました。今回はJSONをパース後、デシリアライズなしで「JObject」や「JArray」に変換する方法を公式サンプルをベースに解説します。

LINQに対応しているので、LINQの構文を使って要素にアクセスすることもできます。

こんなことに使える
  • 自作データクラスを作らずにJSONからデータを取得する
  • 大きなJSONデータから、一部のデータだけ取得する

JSon.NETのインストール方法についてはこちらの記事をご覧ください。

デシリアライズってどうやるの?という方は以下をご覧ください。

環境

この記事の環境は以下で作成・動作確認しています。

環境バージョンなど備考
VisualStudio   2019 Community 2017でも使用できます
.NET4.7.2
プロジェクトコンソールアプリケーション (.NET Framework) 
Json.net13.0.1

Nugetでのインストール方法

Json.NETのインストール方法については、こちらの記事で、画像付きの詳細に解説しています。

ベースにした公式サンプル

この記事は、公式サンプルのこのページをベースにしています。

https://www.newtonsoft.com/json/help/html/LINQtoJSON.htm

実行結果

後述するコードの実行結果は以下の通りです。

JObjectを使ってパースするコードの実行結果

全体コード

前述した、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++でいうと、ベースクラスからアップキャストです)

JTokenクラスの構造を説明する画像

コードのポイント

JObjectへのアクセス

JSONデータの読み取り

JObject.Parse() でJSONデータををJObjectに変換しています。
Linqに対応しているので、Dictionaryのように「Key - Value」のペアで扱うことや、Select等のLINQ文を使うことができます。

JSONの文字列型へのアクセス

「CPU」の値部分にアクセスするために、JObjectの要素名に「”CPU”」を指定しています。

そのまま変数に代入したいところですが、「CPU」のようにKeyに対して、Valueが一意に決まる形式は、Valueの部分が「JValue」という型になります。そのため、Value部分をToString() で文字列型に変換してから代入しています。

JValueの構造を説明する画像

            // パースする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();

JSONの配列型へのアクセス

「Drives」はJSONの配列型のため、Value部分が複数存在しています。
そのため、Keyに「Drives」と指定した後、Valueの”何番目か?” をインデックスで指定する必要があります。

さらに、インデックスで指定した内部データは「JToken型」なので、文字列に代入するためにToString()で変換を行っています。

JArrayクラスの楮を説明する画像

            // パースする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#がよく分からないんだけど…という方へ

「プログラミングを初めてみたい」「専門書を読んだけど分からなかった」という方に以下の書籍をオススメします。

「知識ゼロから始める人」「一度挫折した経験がある人」向けに書かれており「とても分かりやすい」というレビューが多い一冊です。

超初心者~中級の内容を「利用頻度の高いものに絞って」解説しているので、時間のない人でも効率的に学習することができます。

高額なことが多い専門書の中でもコスパのいい本なので、ぜひこの本で「C#のライブラリをスラスラ使いこなせる自分」を目指してみてください。

Json.NETを詳しく知りたい

このブログではJson.NETの他の使い方についても解説しています。興味のある方は以下の記事もご覧ください。

データクラスを使って読み込み・シリアライズをする方法

Dictionaryを使ったシリアライズ・デシリアライズ

応援・要望お待ちしてます

ブログを見ていて「この辺を詳しく知りたい」「このライブラリの使い方を知りたい」「こんなことで困ってる」...etc があれば、コメント・問い合わせ・Twitterで教えてください。質問・ご要望に合わせて解説記事を作ります。

ブログを気に入っていただけたり、「応援してもいいよ」という方がいたら、ブログやSNSでの紹介をお願いします。 あたたかい応援は、中の人の更新の大きな励みになります。

ABOUT ME
えす
現役のソフトウェアエンジニアです。 C++ C# Python を使ってます。10年ちょい設計/開発部門にいましたが、今はQAエンジニアっぽいことをしています。

COMMENT

メールアドレスが公開されることはありません。