C# PR

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

記事内に商品プロモーションを含む場合があります

はじめに

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のインストール方法については、こちらの記事で、画像付きの詳細に解説しています。

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

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

実行結果

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

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クラスの構造を説明する画像

コードのポイント

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() で文字列型に変換してから代入します。

JValueの構造を説明する画像

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ファイルのパースを行う方法を解説しました。

お知らせ

今月号の『Software Design』はドメイン駆動設計(DDD)。実例を交えたDDDの手法の解説が特集されています。

編集:Software Design 編集部
¥1,562 (2024/03/13 12:59時点 | Amazon調べ)

Json.NETを詳しく知りたい

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

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

質問・要望 大歓迎です

「こんな解説記事作って」「こんなことがしたいけど、〇〇で困ってる」など、コメント欄で教えてください。 質問・要望に、中の人ができる限り対応します。

使えたよ・設定できたよの一言コメントも大歓迎。気軽に足跡を残してみてください。記事を紹介したい方はブログ、SNSにバシバシ貼ってもらってOKです。

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

COMMENT

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