はじめに
あんまりこの辺の基本機能が有名ではないようなので紹介しておこうかと思います。
ちなみにですが XML でもまったく同じことが可能です。
前提
- 適当な C# プロジェクトを作っておいてください
JSON
今回は以下のような JSON を利用していこうと思います。
{
"body": "Weekly MTG on %{Year}/%{month}/%{day}",
"id": 1,
"name": "Weekly MTG",
"expanded_body": "Weekly MTG on 2000/01/01",
"expanded_tags": [
{
"name": "MTG/2000/01/01",
"versions": [
"0.0.1"
]
}
],
"expanded_title": "Weekly MTG on 2015/06/03",
"tags": [
{
"name": "MTG/%{Year}/%{month}/%{day}",
"versions": [
"0.0.1"
]
}
],
"title": "Weekly MTG on %{Year}/%{month}/%{day}"
}
この JSON をクリップボードにコピーしておいてください。
Visual Studio
クラスファイルを 1つ 追加する
JSON を クラス として貼り付ける
[ 編集 ] → [ 形式を選択して貼り付け ] → [ JSON をクラスとして貼り付ける ]
Rootobject クラスを修正する
Rootobject
というクラスとともに関連クラスが自動で生成されるので, あとはお好みで修正していきます。
ここで注意しなければならないのは, "プロパティ名を変更してはならない" ということです。クラス名は変更しても問題ありません。
ここで問題になってくるのが, プロパティ名が通常の C# コーディングガイドラインに則っていないことです。
そこで今回は System.Runtime.Serialization.DataMemberAttribute を利用していこうと思います。
各プロパティにこの属性を利用してあげて、以下のようにします。
これで Upper Camel Case でプロパティを書きつつ正常にデシリアライズできるようになりました。
ここで注意ですが, 利用するデシリアライザによっては別の Attribute が用意されている可能性があるので, その辺りはドキュメントに従って良しなに対応してください。
デシリアライズしてみる
nugetから Utf8Json を導入してデシリアライズしてみます。
using System;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
var json = @""
{
""body"": ""Weekly MTG on %{Year}/%{month}/%{day}"",
""id"": 1,
""name"": ""Weekly MTG"",
""expanded_body"": ""Weekly MTG on 2000/01/01"",
""expanded_tags"": [
{
""name"": ""MTG/2000/01/01"",
""versions"": [
""0.0.1""
]
}
],
""expanded_title"": ""Weekly MTG on 2015/06/03"",
""tags"": [
{
""name"": ""MTG/%{Year}/%{month}/%{day}"",
""versions"": [
""0.0.1""
]
}
],
""title"": ""Weekly MTG on %{Year}/%{month}/%{day}""
}
"";
var x = Utf8Json.JsonSerializer.Deserialize<Template>(json);
Console.WriteLine($"body= {x.Body}\r\nid= {x.ID}\r\nname= {x.Name}");
}
}
}
おわりに
生成されるクラスが最初から Upper Camel だと, もっと使いやすいのですが…。
そこは今後に期待というところですね。