JSON

【Json.NET】JsonProperty JSONの変数名が日本語の場合にデシリアライズする方法

はじめに

C#で人気のライブラリ NewtonSoft Json.NETで、JSONの変数名に日本語特殊な名前が使われている場合の解決策について解説します。

JSon.netでは、基本的に自作クラスを作成してJSONと同じ変数名のメンバを作れば、JSon.NET側が自動的にデシリアライズしてくれます。

ですが、JSONの変数名が「日本語」だったり「記法(キャメルケースなど)が異なっていたり」名前自体がコードと合わずに実装できない!といった場合もあるかと思います。

そういった場合は、「JsonProperty」を使うことで、JSONの変数と違う名前のメンバを作ることができます。

こんなことに使える
  • JSONのKey(変数)名が日本語の場合のデシリアライズ
  • JSONのKey名とデータクラスの名前を変えたい

通常のデシアライズはどうするの?という方は以下の記事も参照ください。

環境

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

JSONファイルと実行結果

日本語や特殊な変数名が含まれるJSONファイルと、デシリアライズするコードの実行結果は以下の通りです。

JSONファイル

  • 「メールアドレス」が日本語の変数名になっています。
  • __CREATED_date__が特殊な変数名になっています。
{
  "メールアドレス": "james@example.com",
  "Active": true,
  "__CREATED_date__": "2013-01-20T00:00:00Z",
  "Roles": [
    "User",
    "Admin"
  ]
}

JsonPropertyに日本語を設定する際は、文字コードに注意してください。
本記事のJSONファイルはutf-8であることを前提に解説しています。

実行結果

全体コード

上述したJSONファイルを、「JsonProperty」を使ってデシリアライズするコードです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.IO;          // ファイルの読み書きに必要です
using Newtonsoft.Json; // Json.net用に必要です

namespace ConsoleAppJsonProperty
{
    class Program
    {

        //
        // デシリアライズ用のデータクラスです
        //
        public class Account
        {
            // JsonPropertyでJSON変数 "メールアドレス" を 
            //  メンバ変数 "Email" に入れるように設定します

            [JsonProperty("メールアドレス")]
            public string Email { get; set; }
            
            public bool Active { get; set; }
            

            // 特殊な変数名も、読みやすい変数に入れることができます

            [JsonProperty("__CREATED_date__")]
            public DateTime CreatedDate { get; set; }
            
            public IList<string> Roles { get; set; }
        }


        static void Main(string[] args)
        {

            //
            // 注意:
            // Cドライブの直下に、test.jsonのファイルが保存済みであることを前提にしています。
            //

            // デシリアライズするデータクラスのオブジェクトです
            Account account = null;

            try
            {
                //
                // jsonファイルを読み込みます
                //
                using (StreamReader file = File.OpenText(@"C:\test_jp.json"))
                {
                    // Json.netのオブジェクトを作成します
                    JsonSerializer serializer = new JsonSerializer();

                    // デシリアライズ関数に
                    // 読み込んだファイルと、データ用クラスの名称(型)を指定します。
                    // 
                    // デシリアライズされたデータは、自動的にaccountの
                    // メンバ変数に格納されます 
                    //
                    account = (Account)serializer.Deserialize(file, typeof(Account));
                }

                // 表示してみます
                Console.WriteLine("Email : " + account.Email);
                Console.WriteLine("Active: " + account.Active);
                Console.WriteLine("Date  : " + account.CreatedDate);

                foreach (string role in account.Roles)
                {
                    Console.WriteLine("Roles : " + role);
                }
            }

            catch
            {
                Console.WriteLine("ファイル読み込み時に例外が発生しました。");
            }

            Console.WriteLine("キーを押すと終了します");
            Console.ReadKey();

        }
    }
}

コードのポイント

JsonProperty

自作データクラス(Account)のメンバ変数の上に、[ JsonProperty("メールアドレス") ]として、デシリアライズしたいJSONデータ変数名を指定します。

こうすることで、Json.NETがJSON変数名とクラスのメンバ変数名の対応を解釈して自動でデシリアライズしてくれます。

この仕組みにより、JSONの変数名が日本語等でも、コード側は影響を受けずに実装することができます。

        public class Account
        {
            // JsonPropertyでJSON変数"メールアドレス" を メンバ変数Emailに入れるように設定します
            [ JsonProperty("メールアドレス") ]
            public string Email { get; set; }
            
            public bool Active { get; set; }
            

            // 特殊な変数名も、読みやすい変数に入れることができます

            [JsonProperty("__CREATED_date__")]
            public DateTime CreatedDate { get; set; }
            
            public IList<string> Roles { get; set; }
        }

まとめ

C#で人気のライブラリ NewtonSoft Json.NETで、JSONの変数名に日本語や特殊な名前が使われている場合の解決策、JsonPropertyについて解説しました。参考になればうれしいです。

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

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

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

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

COMMENT

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