VB.NET에서 DataSet을 JSON에서 클래스로 변환

Visual Studio에 JSON에서 클래스를 생성하는 기능이있는 것 같습니다. (이하 링크 참조)

【C#】 【Visual Studio】 Visual Studio에서 JSON에서 클래스 생성
ㅡtp // 하테나아 ry. jp/엔트리/2015/07/10/210000

이것은 DataSet을 JSON으로 변환하고 거기에서 클래스를 생성하는 것입니다.

DataSet → JSON → 클래스
클래스 → JSON → DataSet

와 같은 상호 변환이 가능하게 되지 않을까 생각해 보았습니다.

환경



Windows 7 Professional SP1 64bit
Visual Studio 2017 커뮤니티
Newtonsoft.Json 10.0.2 ※ NuGet으로 솔루션에 패키지를 추가해 주세요

프로젝트 만들기



이번에는 Visual Basic의 Windows Forms 응용 프로그램에서 만들었습니다.

양식에 버튼과 데이터 그리드를 배치합니다.


변환할 데이터 세트를 만듭니다.


각 컬럼의 유형은 다음과 같습니다.
DataColumn1: Integer
DataColumn2: String
DataColumn3: Datetime

DataSet을 JSON으로 변환



버튼 클릭 이벤트로 DataSet을 JSON으로 변환하는 프로그램을 만듭니다.
DataTable을 직렬화하여 JSON으로 변환합니다.

Form.vb
Imports Newtonsoft.Json

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        ''変換元データセットを初期化
        Dim srcds As New DataSet1
        For i As Integer = 1 To 5
            Dim row As DataSet1.DataTable1Row = srcds.DataTable1.NewDataTable1Row
            row.DataColumn1 = i.ToString
            row.DataColumn2 = "データ" + i.ToString
            row.DataColumn3 = Date.Now
            srcds.DataTable1.AddDataTable1Row(row)
        Next

        ''データテーブルをJSONに変換 ※DataTableをシリアライズする
        Dim dataset_json As String = JsonConvert.SerializeObject(srcds.DataTable1, Formatting.Indented)
        Debug.WriteLine(dataset_json)
    End Sub
End Class

이대로 실행하면 출력(디버그)에 JSON이 출력됩니다.

출력 (디버그)
[
  {
    "DataColumn1": 1,
    "DataColumn2": "データ1",
    "DataColumn3": "2017-06-12T21:55:14.0343035"
  },
  {
    "DataColumn1": 2,
    "DataColumn2": "データ2",
    "DataColumn3": "2017-06-12T21:55:14.0373039"
  },
  {
    "DataColumn1": 3,
    "DataColumn2": "データ3",
    "DataColumn3": "2017-06-12T21:55:14.0373039"
  },
  {
    "DataColumn1": 4,
    "DataColumn2": "データ4",
    "DataColumn3": "2017-06-12T21:55:14.0373039"
  },
  {
    "DataColumn1": 5,
    "DataColumn2": "データ5",
    "DataColumn3": "2017-06-12T21:55:14.0373039"
  }
]

JSON에서 클래스 만들기



출력된 JSON을 복사하여 형식을 지정하고 붙여넣기에서 "JSON을 클래스로 붙여넣기"를 선택하면 다음과 같은 클래스가 작성된다.

Class1.vb
Public Class Rootobject
    Public Property Property1() As Class1
End Class

Public Class Class1
    Public Property DataColumn1 As Integer
    Public Property DataColumn2 As String
    Public Property DataColumn3 As Date
End Class

이대로 사용하기 어렵기 때문에 다음과 같이 변경했습니다.
Rootobject → DataTable1
Property1() As Class1 → Rows As DataTable1Row() ※괄호를 형의 뒤에
Class1 → DataTable1Row
네임스페이스 모델 추가

Class1.vb
Namespace Model

    Public Class DataTable1
        Public Property Rows As DataTable1Row()
    End Class

    Public Class DataTable1Row
        Public Property DataColumn1 As Integer
        Public Property DataColumn2 As String
        Public Property DataColumn3 As Date
    End Class

End Namespace

JSON에서 클래스로 변환



만든 버튼 클릭 이벤트에 다음 코드를 추가합니다.
model 변수가 위의 클래스가 됩니다. JSON을 List 객체로 deserialize하고 저장합니다.

Form.vb
        ''JSONをクラスに変換 ※クラスは出力したJSONを貼り付けて作成し、Listにデシリアライズする
        Dim model As New Model.DataTable1
        Dim rows As List(Of Model.DataTable1Row) = JsonConvert.DeserializeObject(Of List(Of Model.DataTable1Row))(dataset_json)
        model.Rows = rows.ToArray

여기까지 DataSet→JSON→클래스까지 변환할 수 있었습니다.

클래스에서 DataSet으로 되돌리기



클래스 (model.Rows)를 직렬화하여 JSON으로 변환하고 JSON을 DataTable로 변환합니다.
결국 다음과 같은 프로그램이 될 것입니다.

Form.vb
Imports Newtonsoft.Json

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        ''変換元データセットを初期化
        Dim srcds As New DataSet1
        For i As Integer = 1 To 5
            Dim row As DataSet1.DataTable1Row = srcds.DataTable1.NewDataTable1Row
            row.DataColumn1 = i.ToString
            row.DataColumn2 = "データ" + i.ToString
            row.DataColumn3 = Date.Now
            srcds.DataTable1.AddDataTable1Row(row)
        Next

        ''データテーブルをJSONに変換 ※DataTableをシリアライズする
        Dim dataset_json As String = JsonConvert.SerializeObject(srcds.DataTable1, Formatting.Indented)
        Debug.WriteLine(dataset_json)

        ''JSONをクラスに変換 ※クラスは出力したJSONを貼り付けて作成し、Listにデシリアライズする
        Dim model As New Model.DataTable1
        Dim rows As List(Of Model.DataTable1Row) = JsonConvert.DeserializeObject(Of List(Of Model.DataTable1Row))(dataset_json)
        model.Rows = rows.ToArray

        ''クラスをJSONに変換 ※配列(Rows)をシリアライズする
        Dim model_json As String = JsonConvert.SerializeObject(model.Rows, Formatting.Indented)
        Debug.WriteLine(model_json)

        ''JSONをデータテーブルに変換 ※DataTableにデシリアライズする
        Dim dt As DataSet1.DataTable1DataTable = JsonConvert.DeserializeObject(Of DataSet1.DataTable1DataTable)(model_json)

        ''変換先データセットをグリッドに表示 ※データテーブルの内容をコピー
        Dim destds As New DataSet1
        For Each row As DataSet1.DataTable1Row In dt.Rows
            destds.DataTable1.ImportRow(row)
        Next
        DataGridView1.DataSource = destds.DataTable1
    End Sub
End Class

이제 클래스 → JSON → DataSet으로 변환 할 수있었습니다.

실행



실행하고 그리드에 데이터가 표시되면 완성입니다.
디버거에서 정지하면서 동작을 확인하면 알기 쉽다고 생각합니다.

좋은 웹페이지 즐겨찾기