JSON

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

はじめに

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

以前の記事では、JSONをファイルから読み込んだ後、独自のデータクラスや、Dictionary型にデシリアライズする方法を解説しました。

今回はJSONをパース後、デシリアライズなしで「JObject」や「JArray」に変換する方法を公式サンプルをベースに解説します。

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

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

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

環境

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

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

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

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

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

実行結果

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

全体コード

前述した、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++風に言うと、ベースクラスからアップキャストして使用します。)

コードのポイント

JObjectへのアクセス

JSONデータの読み取り

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

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

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

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

            // パースする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()で変換を行っています。

            // パースする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ファイルのパースを行う方法を解説しました。Json.netについては私も勉強中なので間違い等があればご指摘いただけるとうれしいです。

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

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

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

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

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です