LoginSignup
4
5

More than 3 years have passed since last update.

Visual Studioの基本機能で JSON からクラスを自動生成する方法

Last updated at Posted at 2020-08-02

はじめに

あんまりこの辺の基本機能が有名ではないようなので紹介しておこうかと思います。
ちなみにですが XML でもまったく同じことが可能です。

前提

  • 適当な C# プロジェクトを作っておいてください

JSON

今回は以下のような JSON を利用していこうと思います。

参照: Qiita API v2 | /api/v2/templates/:template_id

{
  "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つ 追加する

今回は Template.cs を追加しました。
image.png

JSON を クラス として貼り付ける

[ 編集 ][ 形式を選択して貼り付け ][ JSON をクラスとして貼り付ける ]
image.png

Rootobject クラスを修正する

Rootobject というクラスとともに関連クラスが自動で生成されるので, あとはお好みで修正していきます。
ここで注意しなければならないのは, "プロパティ名を変更してはならない" ということです。クラス名は変更しても問題ありません。

今回は以下のようにしました。
image.png

ここで問題になってくるのが, プロパティ名が通常の C# コーディングガイドラインに則っていないことです。
そこで今回は System.Runtime.Serialization.DataMemberAttribute を利用していこうと思います。

各プロパティにこの属性を利用してあげて、以下のようにします。
image.png

これで Upper Camel Case でプロパティを書きつつ正常にデシリアライズできるようになりました。
ここで注意ですが, 利用するデシリアライザによっては別の Attribute が用意されている可能性があるので, その辺りはドキュメントに従って良しなに対応してください。

デシリアライズしてみる

nugetから Utf8Json を導入してデシリアライズしてみます。

Program.cs
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}");
        }
    }
}

実行結果は以下のようになります。
image.png

おわりに

生成されるクラスが最初から Upper Camel だと, もっと使いやすいのですが…。
そこは今後に期待というところですね。

4
5
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5