WebSurfer's Home

トップ > Blog 1   |   Login
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

About this blog

2010年5月にこのブログを立ち上げました。主に ASP.NET Web アプリ関係の記事です。

Calendar

<<  June 2024  >>
MoTuWeThFrSaSu
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

View posts in large calendar