はじめに
C#で人気のライブラリ NewtonSoft Json.NETで、JSONの変数名に日本語や特殊な名前が使われている場合の解決策について解説します。
JSon.netでは、基本的に自作クラスを作成してJSONと同じ変数名のメンバを作れば、JSon.NET側が自動的にデシリアライズしてくれます。
ですが、JSONの変数名が「日本語」だったり、「記法(キャメルケースなど)が異なっていたり」、名前自体がコードと合わずに実装できない!といった場合もあるかと思います。
そういった場合は、「JsonProperty」を使うことで、JSONの変数と違う名前のメンバを作ることができます。
Json.netのインストール方法についてはこちらの記事をご覧ください。
通常のデシアライズはどうするの?という方は以下の記事も参照ください。
環境
環境 | バージョンなど | 備考 |
VisualStudio | 2019 Community | 2017でも使用できます |
.NET | 4.7.2 | |
プロジェクト | コンソール(.NET Framework) | |
Json.NET | 13.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について解説しました。参考になればうれしいです。
C#がよく分からないんだけど…という方へ
「プログラミングを初めてみたい」「専門書を読んだけど分からなかった」という方に以下の書籍をオススメします。
「知識ゼロから始める人」「一度挫折した経験がある人」向けに書かれており「とても分かりやすい」というレビューが多い一冊です。
超初心者~中級の内容を「利用頻度の高いものに絞って」解説しているので、時間のない人でも効率的に学習することができます。
高額なことが多い専門書の中でもコスパのいい本なので、ぜひこの本で「C#のライブラリをスラスラ使いこなせる自分」を目指してみてください。
応援・要望お待ちしてます
ブログを見ていて「この辺を詳しく知りたい」「このライブラリの使い方を知りたい」「こんなことで困ってる」...etc があれば、コメント・問い合わせ・Twitterで教えてください。質問・ご要望に合わせて解説記事を作ります。
ブログを気に入っていただけたり、「応援してもいいよ」という方がいたら、ブログやSNSでの紹介をお願いします。 あたたかい応援は、中の人の更新の大きな励みになります。