[Tips] Newtonsoft.Jsonライブラリの使用方法

はじめに

.NET アプリケーションで Json ファイルを効率よく使用するには JSON 用のライブラリを使用するのが一般的です。

今回は Jsonとはなんぞや と Newtonsoft.Json ライブラリを使用する方法について説明します。

本記事を読むことで、JSON と .NETアプリでの JSONファイルの読み書きを習得することができます。

環境

開発環境:Microsoft Visual Studio Enterprise 2019 Version 16.1.1
フレームワーク:.NET Framework 4.7.2
ライブラリ:Json.NET(Newtonsoft.Json) 12.0.2

目次

そもそも JSON とは?

JSON とは JavaScript Object Notation の略称で、テキストベースのデータフォーマットです。

JSON は JavaScript のオブジェクト表記構文のサブセットで、XML と比較すると簡潔に構造化されたデータを記述することができます。シンプルな構造のため人間が理解しやすいデータフォーマットとなっています。なお文字コードは UTF-8 固定です。

構文は JavaScript におけるオブジェクト表記をベースとしていますが、様々な言語で使用されています。

以下に JSON のもっともシンプルな例を示します。

{"IP":"192.168.1.1"}

{} の中に キーと値のペアを「:」で連結して記述します。

キーは「変数」、値は「変数に入れるデータと」考えることができ、上記の例では変数が「IP」データが「192.168.1.1」ということになります。

JSONの構文を覚えよう

JSONの基本構文

前述の通り、JSON ではキーと値を「:」で連結して1組とします。

また、キー(変数)はダブルクォーテーションで囲みます。データは文字列の場合はダブルクォーテーションで囲み、数字であればそのまま記述します。

OK {"IP":"192.168.1.1"} // 正しい書き方
NG {IP:"192.168.1.1"}   // キーをダブルクォーテーションで囲んでいない
NG {'IP':"192.168.1.1}  // キーをダブルクォーテーションで囲んでいない。シングルクォーテーションは×
NG {"IP":192.168.1.1}   // 192.168.1.1 は数字ではなく文字列扱い

複数のキーと値の持たせ方

以下のようにカンマで区切ることで、複数のキーと値を持たせることもできます。

{"IP1":"192.168.1.2","IP2":"192.168.1.3"}

上記のコードは、読みやすくするために以下のように書くこともできます。なおインデントは2文字か4文字にすることが多いようです。

{
  "IP1":"192.168.1.2",
  "IP2":"192.168.1.3"
}

データ型

値に使用できるデータ型には以下のものがあります。

  • 文字列
  • 数値
  • ヌル
  • 真偽値
  • オブジェクト
  • 配列

文字列

すでに説明した通り、文字列はダブルクォーテーションで囲みます。

{"name":"takahiro"}  // 文字列データ takahiro をダブルクォーテーション囲む

また、以下のエスケープシーケンス(*)を使用することができます。

*エスケープシーケンスは、改行やタブ記号など普通の文字記号で表現したもの。JSON の場合、文字列はダブルクォーテーションで囲むので、その中にダブルクォーテーションを含めたい場合はエスケープ処理をする必要がある。このような場合はエスケープシーケンスを使うことで表現できる。

エスケープシーケンス説明
\”ダブルクォーテーション
\\バックスラッシュ
\/スラッシュ
\bバックスペース
\f改ページ(フォームフィード)
\n改行(new line)
\r復帰(carriage return)
\tタブ(horizontal tab)
\uXXXX4桁16進表記のUnicode文字

例えば、文字列中にダブルクォーテーションを含めたい場合は以下のようにします。

{"name":"\"takahiro\""}  // 文字列の中に「"takahiro"」を入れている

数値

数値は、整数や浮動小数点数、指数表記が使用できます。

{
  "age":18,
  "weight":54.3,
  "exp":1.0e-3
}

ヌル

ヌルは「null」で表します。

{
  "age":null
}

真偽値

真偽値は、 true または false で表します。

{
  "真":true,
  "偽":false
}

オブジェクト

オブジェクトは {} で表します。これまでに学んだ JSONデータを入れることができると考えるとよいです。以下の場合は network という変数が IP と SUBNET を持っていることになります。

{
  "network" : {
    "IP":"192.168.1.2",
    "SUBNET":"255.255.255.o0"
  }
}

配列

値は配列にすると複数持つことができます。配列は [] で表し、カンマで区切って複数入れることができます。また、値には文字列、数値、ヌル、真偽値、オブジェクト、配列のすべてを入れることができます。

{
  "fruit":["orange","apple","banana"]
}

JSON のファイル形式について 

ファイルフォーマットは以下の通りです。

エンコーディングUTF-8
拡張子.json
MIMEタイプapplication/json

NuGet による Newtonsoft.Jsonライブラリの追加

それでは本題に入ります。

ここでは、新規プロジェクトとして「コンソールアプリ(.NET Framework)」を作成しているものとして話を進めます。

はじめに Visual Studio のメニューで [プロジェクト] – [NuGet パッケージの管理]を選択します。

続いて、「Json.net」という文字列で検索したら、一覧から「Newtonsoft.Json」を選択して、「インストール」をクリックします。

Newtonsoft.Json のインストール
Newtonsoft.Json のインストール

インストールをする際、以下のように変更のプレビューが表示されます。[OK]を押してインストールをしてください。

変更のプレビュー

インストールが完了すると、プロジェクトエクスプローラーの「参照」には「Newtonson.Json」が追加されます。

追加されたNewtosnsoft.Json

クラスの作成

Newtonsoft.Json を使用するとクラスデータを JSONフォーマットに変換したり、JSONフォーマットのデータをクラスに設定したりすることができます。

はじめに、以下のテスト用クラスを作成します。この Person クラスは、Name(氏名), Age(年齢), Weigth(体重)の3つのデータを持ちます。

JSON フォーマットとして読み書きしたいクラスは 属性 [JsonObject(“任意の名前”)] をつけます。また、読み書きしたいデータは属性 [JsonProperty(“任意の名前”)] をつけます。[JsonProperty()] の属性を指定しなかったデータは読み書き対象にならないので注意が必要です。

using Newtonsoft.Json;

namespace JsonSample
{
    [JsonObject("Person")]
    class Person
    {
        [JsonProperty("Person Name")]
        public string Name { get; set; }

        [JsonProperty("Person Age")]
        public int Age { get; set; }

        [JsonProperty("Person Weight")]
        public double Weight { get; set; }
    }
}

シリアライズしてみよう

シリアライズとは、ある複数の要素を一定の規則で並べる操作や処理のことをいいます。

以下はシリアライズの例です。

先ほど作成した Person クラスのインスタンス化をして、データを設定した後、JsonConvert.SerializeObject メソッドを使用して JSON データにシリアライズしています。

using Newtonsoft.Json;  // Newtonsoft.Jsonを使用するために追加
using System;

namespace JsonSample
{
    class Program
    {
        static void Main(string[] args)
        {
            Person person = new Person();

            // データを設定
            person.Name = "takahiro";
            person.Age = 46;
            person.Weight = 63.5;

            // JSON データにシリアライズ
            var jsonData = JsonConvert.SerializeObject(person);

            // シリアライズされたデータを表示
            Console.WriteLine(jsonData);

            Console.ReadLine();
        }
    }
}

作成したデータは以下のようになります。JSON 形式で出力されていることを確認してください。また、キー名は 属性で指定した名称になることがわかります。

{"Person Name":"takahiro","Person Age":46,"Person Weight\":63.5}

デシリアライズしてみよう

次にデシリアライズをしてみましょう。

デシリアライズはシリアライズの逆で、元のデータ構造に復元する操作や処理のことを言います。

デシリアライズをするには JsonConvert.DeserializeObject<デシリアライズ先のデータ型>(JSONデータ文字列) を使用します。

デシリアライズの例を以下に示します。

using Newtonsoft.Json;
using System;

namespace JsonSample
{
    class Program
    {
        static void Main(string[] args)
        {
            // JSON 形式の文字列を作成
            var jsonData = "{\"Person Name\":\"takahiro\",\"Person Age\":46,\"Person Weight\":63.5}";

            Person person = new Person();

            // インスタンス person にデシリアライズ
            person = JsonConvert.DeserializeObject<Person>(jsonData);

            Console.ReadLine();
        }
    }
}
デシリアライズされたデータの確認

デシリアライズをすると、以下のように person の Name, Age, Weight にそれぞれデータが格納されていることがわかります。

JSONデータをファイルに書き込もう

JSON のシリアライズと組み合わせてファイルに書き込む方法について説明します。

ファイルの書き込みは StreamWriter クラスを使用することとします。22行目で使用している StreamWriter は第1引数が 書き込み先のファイルパス、第2引数が追加書き込みをするかどうか、第3引数が書き込み時のエンコーディング を指定できるものです。第1引数のファイルパスの先頭にある @ ですが、これは文字列中の「\」をエスケープ処理しなくてもいいようにするものです。@をつけない場合は「C:\\work\\json.data」のようにエスケープ処理をしたパスの文字列を書く必要があります。

実際のデータの書き込みは、25行目の write メソッドで行っています。

なお、以下の例ではエラー処理をしていません。書き込み先のディレクトリがなかったり書き込もうとしたファイルがすでにつかまれているような場合はエラーが発生しますので注意してください。

using Newtonsoft.Json;
using System;
using System.IO;  // ファイル書き込みのために追加

namespace JsonSample
{
    class Program
    {
        static void Main(string[] args)
        {            
            Person person = new Person();
  
            // データを設定
            person.Name = "takahiro";
            person.Age = 46;
            person.Weight = 63.5;

            // JSON データにシリアライズ
            var jsonData = JsonConvert.SerializeObject(person);

            // C:¥Work¥test.json を UTF-8 で書き込み用でオープン
            using (var sw = new StreamWriter(@"C:\Work\test.json", false, System.Text.Encoding.UTF8))
            {
                // JSON データをファイルに書き込み
                sw.Write(jsonData);
            }

            Console.ReadLine();
        }
    }
}

JSONファイルを読み込もう

続いて、JSONファイルのデータを読み込んでシリアライズする例を示します。ファイルの読み込みには StreamReader を使用することとします。 StreamReader の第1引数には読み込み対象のファイルパスを、第2引数にエンコーディングを指定しています。

実際のデータ読み込みは、17行目の ReadToEnd メソッドで行っています。ReadToEndメソッドは指定したファイルを先頭から末尾までをすべて読み込んで文字列として返します。

読み込んだデータは20行目でデシリアライズをしています。

なお以下の例ではエラー処理をしていません。読み込み先のファイルがない場合や、デシリアライズでできない場合はエラーになるので注意してください。

using Newtonsoft.Json;
using System;
using System.IO;  // ファイル書き込みのために追加

namespace JsonSample
{
    class Program
    {
        static void Main(string[] args)
        {
            Person person = new Person();

            // C:¥Work¥test.json を UTF-8 で開く
            using (var sr = new StreamReader(@"C:\Work\test.json", System.Text.Encoding.UTF8))
            {
                // 変数 jsonData にファイルの内容を代入 
                var jsonData = sr.ReadToEnd();

                // デシリアライズして person にセット
                person = JsonConvert.DeserializeObject<Person>(jsonData);
            }

            Console.ReadLine();
        }
    }
}

コメントを残す

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください