WebSurfer's Home

Filter by APML

JSON 文字列から C# のクラス定義生成

by WebSurfer 10. May 2020 14:24

Newtonsoft.Json などを利用して JSON 文字列を C# のオブジェクトにデシリアライズする際、C# のオブジェクトのクラス定義が必要ですが、Visual Studio を利用してクラス定義を得ることが可能です。

JSON 文字列から C# のクラス定義生成

JSON 文字列をコピー(クリップボードに取得)し、Visual Studio のエディタ上でコードを張り付けたい場所にカーソルを置き、上の画像のように[編集(E)]⇒[形式を選択して貼り付け(S)]⇒[JSON をクラスとして張り付ける(J)]でカーソルの場所に C# のクラス定義が生成されます。

(VS2019 と VS2015 で確認。ちなみに、英語版 Visual Studio では [Edit] ⇒ [Paste Special] ⇒ [Paste JSON As Classes] となります)

具体的には、例えばある Web API の仕様として以下の JSON 文字列のサンプルが公開されていたとします。

{    
  "request":
  {
    "transaction":
    {
      "id" : "10",
      "server" : "10"
    },
    "list" :
    [
      { "group" : "1", "data" : "XXXXX" },
      { "group" : "1", "data" : "XXXXX" }
    ]
  }
}

C# のアプリケーションでこの Web API にアクセスして JSON 文字列を取得して利用する場合は、その JSON 文字列を C# のオブジェクトにデシリアライズすることになります。

デシリアライズに、例えば Newtonsoft.Json の DeserializeObject<T>(String) メソッドを使う場合 T のクラス定義が必要になります。

その場合、上の JSON 文字列をコピー(クリップボードに取得)して、この記事の一番上の画像のように Visual Studio を操作すれば以下の画像の通りカーソルを置いた場所にクラス定義が生成されます。

生成されたクラス定義

DeserializeObject<T>(String) メソッドの T は上の画像でいうと Rootobject になりますので、それを使って Rootobject 型の C# のオブジェクトにデシリアライズできます。

知ってました? 実は自分は最近まで知らなかったです。(汗)


【2023/12/24 追記】

VB.NET の場合ですが、この記事の機能を使って生成したクラス定義ではデシリアライズできないケースがあったので、忘れないように書いておきます。

例えば、上に書いた Visual Studio の機能を使って、以下の JSON 文字列から、

{
  "Response": [
    {
      "Version": 1,
      "StatusCode": "OK",
      "Data": [ "12", "34", "56" ]
    },
    {
      "Version": 2,
      "StatusCode": "NG",
      "Data": [ "78", "90", "02" ]
    }
  ]
}

VB.NET のクラス定義を生成すると以下のようになります。

Public Class Rootobject
    Public Property Response() As Response
End Class

Public Class Response
    Public Property Version As Integer
    Public Property StatusCode As String
    Public Property Data() As String
End Class

問題は Rootobject クラスの Response プロパティと Response クラスの Data プロパティの定義です。

上の JSON 文字列を System.Test.Json または Newtonsoft.json を使って、上の Rootobject, Response クラスのオブジェクトにデシリアライズしようとすると失敗して例外がスローされます。

問題を回避するには Response プロパティ、Data プロパティの定義を以下のように変更します。

Public Class Rootobject
    Public Property Response As Response()  ' 変更
End Class

Public Class Response
    Public Property Version As Integer
    Public Property StatusCode As String
    Public Property Data As String()  ' 変更
End Class

VB.NET の配列の宣言には以下のように 2 つの方法があって、前者の方が一般的なのか、この記事のツールも前者になります。また、配列の宣言と同時に割り当てを行う場合には前者のような書き方しかできないので、前者に統一しておくのがよいという記事も目にします。

Dim arrayA() As String
Dim arrayB As String()

しかしながら、デシリアライズに使うクラス定義のプロパティでは、上のコードで検証した限りの話ですが、配列の宣言は後者のようにする必要があるということでした。

Tags: , ,

DevelopmentTools

VS2019 で RDLC デザイナの表示

by WebSurfer 24. April 2020 12:29

ReportViewer を使うアプリを作成する際 .rdlc ファイルを生成しますが、そのデザイナを Visual Studio Community 2019 で表示するにはどうしたらよいかを書きます。

RDLC デザイナ

Visual Studio 2015 では SQL Server Data Tool をインストールするだけで RDLC デザイナもインストールされました。ちなみに、インストールするには、コントロールパネルの「プログラムと機能」で Visual Studio 2015 を探し、それを右クリックすると [変更(C)] と出てくるのでそれをクリック、表示されるダイアログの [Modify] をクリック、表示されるダイアログで Microsoft SQL Server Data Tools にチェックを入れて UPDATE すれば OK です。

VS2015 SSDT

Visual Studio 2019 の場合、SQL Server Data Tools は下の画像のようにワークロードの「データの保存と処理」をインストールする際にオプションの「SQL Server Data Tools」にチェックを入れればインストールされます。

SSDT

しかし、それだけでは RDLC デザイナはインストールされないようです。.rdlc ファイルを開くと生の xml コードしか表示されません。

visual studio 2019 rdlc designer でググってしらべると Microsoft RDLC Report Designer という以下の記事がヒットしました。どうもこれをインストールする必要があるようです。

上のページからダウンロードしてインストールする必要はなく、Visual Studio 2019 を起動してメニューバーの[拡張機能(X)]から追加できます。以下の画像を見てください。

Microsoft RDLC レポートデザイナー

インストール後 .rdlc ファイルを開けば、この記事の一番上の画像のような RDLC デザイナ画面が表示されるはずです。自分の環境では ReportViewer v12, v15 いずれのバージョンも OK でした。

なお、Visual Studio 2017 は自分は持っていませんので、どうなっているのかは不明です。

Tags: , , ,

DevelopmentTools

VS2019 で Web サイトプロジェクト作成

by WebSurfer 23. April 2020 11:44

Visual Studio 2015 以前(VS2017 は不明)では以下の画像のように [File] ⇒ [New] ⇒ [Wen Site...] (日本語版では[ファイル(F)]⇒[新規作成(N)]⇒[Web サイト(W)...]) で ASP.NET Web Forms の Web サイトプロジェクト作成用のテンプレートが表示されました。Visual Studio 2019 ではそのメニューがどこにあるかという話を書きます。

Visual Studion 2015

今は Web アプリケーションプロジェクトを使うのが主流ですが、ASP.NET がリリースされた頃の Web Forms アプリでは Web サイトプロジェクトを使っていました。検証などでページ単位にちょっと試してみたいというような場合は Web サイトプロジェクトが便利なので自分は今でも使っています。

両者の特徴は Microsoft のドキュメント「Web アプリケーションプロジェクトと Web サイトプロジェクト」に詳しく書かれていますので見てください。

Web サイトプロジェクトを使うメリットは、上に紹介した記事に書いてありますように、

"Web アプリケーションのごく一部を変更する場合、アプリケーション全体を再配置する必要はありません。 変更したファイルを運用 IIS サーバーにコピーするだけです。 運用サーバー上でファイルを直接編集することもできます (Web アプリケーション プロジェクトのコード ファイルは単一のアセンブリ ファイルにコンパイルされるため、.aspx ファイルまたは .ascx ファイルのみが変更された場合を除き、少しの変更でもサイト全体を配置する必要があります)。"

・・・ということです。

Web アプリケーションプロジェクトの場合は、特定のページのコードをちょっと変更しただけで全部コンパイルし直さなければならないのですが、コンパイルし直すのに時間がかかるし、一部の変更が他の部分に思わぬ影響を与えることもあるし、あるページは C# で別のページを VB.NET で作るということはできないなど、開発時の検証目的で使う場合はデメリットが大きいと思います。

で、VS2019 ではどのようにすれば Web サイトプロジェクトを作成できるかですが、まず、下の画像のように、ワークロードに「ASP.NET と Web 開発」を選択し「インストールの詳細」で[追加のプロジェクトテンプレート (以前のバージョン)]にチェックを入れてインストールします。

追加のプロジェクトテンプレート

そして、VS2019 の[ファイル(F)]⇒[新規作成(N)]⇒[プロジェクト(P)...]で「新しいプロジェクトの作成」ダイアログを開けば、その中の[ASP.NET Web Forms サイト]という Web サイトプロジェクト用のテンプレートが選択できるはずです。

新しいプロジェクトの作成

上の画面で[ASP.NET Web Forms サイト]を選択して[次へ(N)」をクリックして先に進み、次の画面でプロジェクトの名前、プロジェクトを生成する場所(フォルダ)、フレームワークを設定してから[作成(C)]をクリックすればプロジェクトが自動生成されます。

Default.aspx

上の画像は、生成されたプロジェクトを VS2019 から[デバッグ(D)]⇒[デバッグの開始(S)](または[デバッグなしで開始(H)]) で実行し、Default.aspx を表示したものです。

(注:アドレスバーに表示されているのが Default.aspx ではなくて Default となっている理由は、テンプレートに実装されている Friendly url の機能によるものです。もちろん無効に設定できます)

Tags: ,

DevelopmentTools

About this blog

2010年5月にこのブログを立ち上げました。主に ASP.NET Web アプリ関係の記事です。ブログ2はそれ以外の日々の出来事などのトピックスになっています。

Calendar

<<  June 2026  >>
MoTuWeThFrSaSu
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

View posts in large calendar