VB.NET+JSON.NET+InterSystems Cache'에서 JSON→클래스→DB 생성(ODB)까지 단번에 자동화

전회 소개한 「Cache' eXTreme」(.NET측의 클래스를 자동적으로 반영시킨, 공유 메모리형 DB 운용) 기술의 응용입니다.

1. VB.NET에는 JSON 파일에서 클래스 구조를 코드 생성하는 기능이 있습니다.
2. JSON.NET을 사용하면 JSON 파일에서 클래스 구조를 반영하는 객체를 동적으로 만들 수 있습니다.
3. eXTreme 기술은 VB.NET의 클래스 구조를 Cache'DB에 자동으로 반영하여 테이블을 생성합니다.

이들을 결합하면 무슨 일이 일어나는가 :
"프로그래머가 테이블의 필드를 전혀 모르더라도 올바른 테이블 구조를 (게다가 객체적으로) 해석하고, 클래스를 생성해 취급해, 인스턴스의 동적 생성, 데이터 보존까지 자동화할 수 있다"라고 하는 것이 가능하게 됩니다.

이 기능 중 무엇이 훌륭합니까?
옛날 전이라면 : 소켓 통신으로 「접속 사양서를 보내주세요」라고 말해, 종이를 받고, 같은 오브젝트 구조를 손으로 입력해, 그리고 O/R 매핑을 생각, 라고 하는 단계를 생략할 수 있습니다.
최근이라면 : 벤더간에 "JSON 형식으로 데이터를 받고 싶습니다"라는 요청에 대해 "연결 사양서를 보내주세요"라고 말하고 종이를 받고 JSON.NET에서 클래스까지는 생성하지만 , O/R 매핑이 결국 필요하고 곤란해 버리는, 라고 하는 시츄에이션을 해소할 수 있습니다.

Vb.NET 측 준비;
프로젝트를 새로 생성하고 프로젝트 → NuGet 패키지 관리를 엽니다. Neutonsoft.Json을 검색하고 안정 버전을 설치합니다.

과거에 설치한 적이 있다면 프로젝트 → 참조 추가에서 어셈블리에서 JSON.NET을 찾아 체크하는 방법도 OK.

프로젝트 → 참조 추가로,
InterSystems.Data.CacheClient.dll
InterSystems.Data.CacheExtreme.dll 추가.
(장소는 이미지를 참고로)

VB.NET에서 추가 → 신규 항목으로, JSON 구조를 기술하는 클래스 파일(여기서는 TestJSON.vb)을 작성한다.


가져오고 싶은 JSON 파일(여기서는 C:\data\test.json으로 한)을 메모장 등에서 열고 전체 선택 → 복사하고 TestJSON.vb의 편집 화면에서 편집 → JSON을 클래스로 붙여 넣으면 구조 가 자동으로 클래스화됩니다.


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

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하는 것만으로 올바르게 저장된다.
또 클래스 인스턴스는 도트 구문으로 기술할 수 있으므로, 폴리모피즘도 자유자재이다.

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

폼 위에서의 호출은 다음과 같다.

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 클래스 계층 구조가 테이블 이름으로 어떻게 반영되는지 주목합니다.

좋은 웹페이지 즐겨찾기