VB.NET+JSON.NET+InterSystems Cache'でJSON→クラス→DB生成（ODB）まで一気に自動化

前回紹介した「Cache' eXTreme」（.NET側のクラスを自動的に反映させた、共有メモリ型DB運用）技術の応用です。

１．VB.NETには、JSONファイルからクラス構造をコード生成する機能があります。
２．JSON.NETを使うと、JSONファイルからクラス構造を反映したオブジェクトを動的に作れます。
３．eXTreme技術は、VB.NET上のクラス構造を自動的にCache'DBに反映させてテーブルを生成してくれます。

これらを組み合わせると、何が起きるか：
「プログラマがテーブルのフィールドを一切知らなくても、正しいテーブル構造を（しかもオブジェクト的に）解析し、クラスを生成して取り扱い、インスタンスの動的生成、データ保存まで自動化できる」ということが可能になります。

この機能の何が素晴らしいかというと、
ひと昔前なら：ソケット通信で「接続仕様書を送って下さい」と言って、紙をもらい、同じオブジェクト構造を手で入力し、そしてO/Rマッピングを考え、という段階を省略できます。
最近なら：ベンダー間において「JSON形式でデータを受け取ってほしいんです」というリクエストに対し、「接続仕様書を送ってください」と言って、紙をもらい、JSON.NETでクラスまでは生成するけれども、O/Rマッピングが結局必要で困ってしまう、というシチュエーションを解消できます。

Vb.NET側の準備；
プロジェクトを新規生成し、プロジェクト→NuGetパッケージの管理を開く。Neutonsoft.Jsonを検索し、安定版をインストールする。
![20180906-1.PNG](https://qiita-image-store.s3.amazonaws.com/0/262065/eef1110e-1969-bf6f-90e1-220c7ec9cfd7.png)
過去にインストールしたことがあれば、プロジェクト→参照の追加から、アセンブリでJSON.NETを探してチェックする方法もOK。
![20180906-2.PNG](https://qiita-image-store.s3.amazonaws.com/0/262065/d8f4c8c5-5222-22ae-cb3d-48275f6c2020.png)
プロジェクト→参照の追加で、
InterSystems.Data.CacheClient.dll
InterSystems.Data.CacheExtreme.dllを追加する。
（場所は画像を参考に）
![20180906-3.PNG](https://qiita-image-store.s3.amazonaws.com/0/262065/1e749ca3-9a4d-3aed-50fd-eaf46c9c2fe4.png)
VB.NETで追加→新規の項目で、JSON構造を記述するクラスファイル（ここではTestJSON.vb）を作成する。
![20180905-2.PNG](https://qiita-image-store.s3.amazonaws.com/0/262065/cb772320-77b6-bddd-b1d6-37978533b94b.png)

取り込みたいJSONファイル（ここではC:\data\test.jsonとした）をメモ帳などで開き、全選択→コピーし、TestJSON.vbの編集画面で編集→JSONをクラスとして貼り付けるとすると、構造が自動的にクラス化される。
![20180905-1.PNG](https://qiita-image-store.s3.amazonaws.com/0/262065/47540282-b425-cf2b-2e1f-b3119baae6ca.png)

```json:test.json
{
	"version": "1.0.0",
	"contents": {
		"package": {
			"displayName": "Red テーマ",
			"description": "Visual Studio Code の Red テーマ"
		}
	}
}
```


```vb:TestJSON.vb
Public Class Rootobject
    Public Property version As String
    Public Property contents As Contents
    End Class

    Public Class Contents
        Public Property package As Package
    End Class

    Public Class Package
        Public Property displayName As String
        Public Property description As String
    End Class

```

コアとなるコードは次の通り。
一方のクラスでeXTremeのImportSchemaでVB.NETをDB構造として準備する。
そのクラスインスタンスにJsonConvert.DeserializeObject(Of VBCacheJSONTest.Rootobject)を用い、JSONファイルをJSON.NETで読み込んで型変換する。
そのデータはDB上にStoreするだけで正しく保存される。
またクラスインスタンスはドット構文で記述できるので、ポリモーフィズムも自在である。

```vb:VBJSONExtreme.vb
Imports InterSystems.XEP
Imports Newtonsoft.Json
Imports VBCacheJSONTest
Public Class VBJSONeXTreme

    Sub testSub()
        'Setup eXTreme
        Dim namespc As String = "USER"
        Dim username As String = "yourname"
        Dim password As String = "yourpass"
        Dim myPersister As EventPersister = PersisterFactory.CreatePersister()
        myPersister.Connect(namespc, username, password)

        'Dynamic Class Generation
        Dim className As String = "VBCacheJSONTest.Rootobject"
        myPersister.ImportSchema(className) 'Cache'側のClassも呼び出せるとのこと
        Dim newEvent As InterSystems.XEP.Event = myPersister.GetEvent(className)

        'Data Read From JSON File
        Dim eventData As Rootobject
        eventData = JsonConvert.DeserializeObject(Of VBCacheJSONTest.Rootobject)(File.ReadAllText("c:\data\Test.json"))'ここがStringで記述すれば、通信時のデータを直接（構造ごと）投げ込める

        Dim str As String = eventData.version 'JSONをオブジェクト指向で使う方法
        MsgBox(str)

        'Save To Cache eXTreme
        Dim itemIDs As Long = newEvent.Store(eventData)

        myPersister.Close()


    End Sub


End Class
```

フォーム上からの呼び出しは次の通り。

```vb:Form1.vb
 Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Dim d As New VBJSONeXTreme()

        d.testSub()

    End Sub

```
Cache→管理ポータル→システムエクスプローラ→SQLでの実行結果は次の通り。JSONのクラス階層がテーブル名としてどのように反映されているかに注目です。
![20180906-4.PNG](https://qiita-image-store.s3.amazonaws.com/0/262065/c438e634-1cb1-fbe4-22d1-15e75648b532.png)