StealthRT
StealthRT

Reputation: 10552

SQL data to custom JSON.net structure

Hey all I have the following SQL query that outputs the following:

ID  | Name    | theRole | THrs | Mon   |....| trainH1 | train58 | train52 | train05 |etc...
===========================================================================================
152 | BOB M.  | Admin   | 40   | 1-9pm |....| 168dGrc0 | 89220E | 2FDEx56 | 5569CCz |......

Ideally I would like the structure to look like this [Note: With additional table names below]:

{
    "scheduleName": "",
    "firstName": "",
    "lastName": "",
    "theRole": "",
    "linker": "",
    "Schedule": {
        "ID": "",
        "totalHrs": "",
        "Mon": "",
        "Tue": "",
        "Wed": "",
        "Thu": "",
        "Fri": "",
        "Sat": ""
    },
    "empInfo": {
        "ID": "",
        "Email": "",
        "Phone": "",
        "Active": "",
        "Img": "",
        "Badge": ""
    },
    "availability": {
        "ID": "",
        "Mon": "",
        "Tue": "",
        "Wed": "",
        "Thu": "",
        "Fri": "",
        "Sat": ""
    },
    "training": {
        "?": "?"
    }
}

The train is where I am having issues. These values from the database can change names at any given time or be added or deleted. Currently I have around 35 values for this. Therefore, I am unable to hard code those values within my class function as I can do with ID, Name, theRole, THrs, etc...

The VB.net class definition looks like this so far:

Public Class Schedule
    Private m_ID As String
    Private m_totalHrs As String
    Private m_Mon As String
    Private m_Tue As String
    Private m_Wed As String
    Private m_Thu As String
    Private m_Fri As String
    Private m_Sat As String

    Public Property ID() As String
        Get
            Return m_ID
        End Get
        Set
            m_ID = Value
        End Set
    End Property

    Public Property totalHrs() As String
        Get
            Return m_totalHrs
        End Get
        Set
            m_totalHrs = Value
        End Set
    End Property

    Public Property Mon() As String
        Get
            Return m_Mon
        End Get
        Set
            m_Mon = Value
        End Set
    End Property

    Public Property Tue() As String
        Get
            Return m_Tue
        End Get
        Set
            m_Tue = Value
        End Set
    End Property

    Public Property Wed() As String
        Get
            Return m_Wed
        End Get
        Set
            m_Wed = Value
        End Set
    End Property

    Public Property Thu() As String
        Get
            Return m_Thu
        End Get
        Set
            m_Thu = Value
        End Set
    End Property

    Public Property Fri() As String
        Get
            Return m_Fri
        End Get
        Set
            m_Fri = Value
        End Set
    End Property

    Public Property Sat() As String
        Get
            Return m_Sat
        End Get
        Set
            m_Sat = Value
        End Set
    End Property
End Class

Public Class EmpInfo
    Private m_ID As String
    Private m_Email As String
    Private m_Phone As String
    Private m_Active As String
    Private m_Img As String
    Private m_Badge As String

    Public Property ID() As String
        Get
            Return m_ID
        End Get
        Set
            m_ID = Value
        End Set
    End Property

    Public Property Email() As String
        Get
            Return m_Email
        End Get
        Set
            m_Email = Value
        End Set
    End Property

    Public Property Phone() As String
        Get
            Return m_Phone
        End Get
        Set
            m_Phone = Value
        End Set
    End Property

    Public Property Active() As String
        Get
            Return m_Active
        End Get
        Set
            m_Active = Value
        End Set
    End Property

    Public Property Img() As String
        Get
            Return m_Img
        End Get
        Set
            m_Img = Value
        End Set
    End Property

    Public Property Badge() As String
        Get
            Return m_Badge
        End Get
        Set
            m_Badge = Value
        End Set
    End Property
End Class

Public Class Availability
    Private m_ID As String
    Private m_Mon As String
    Private m_Tue As String
    Private m_Wed As String
    Private m_Thu As String
    Private m_Fri As String
    Private m_Sat As String

    Public Property ID() As String
        Get
            Return m_ID
        End Get
        Set
            m_ID = Value
        End Set
    End Property

    Public Property Mon() As String
        Get
            Return m_Mon
        End Get
        Set
            m_Mon = Value
        End Set
    End Property

    Public Property Tue() As String
        Get
            Return m_Tue
        End Get
        Set
            m_Tue = Value
        End Set
    End Property

    Public Property Wed() As String
        Get
            Return m_Wed
        End Get
        Set
            m_Wed = Value
        End Set
    End Property

    Public Property Thu() As String
        Get
            Return m_Thu
        End Get
        Set
            m_Thu = Value
        End Set
    End Property

    Public Property Fri() As String
        Get
            Return m_Fri
        End Get
        Set
            m_Fri = Value
        End Set
    End Property

    Public Property Sat() As String
        Get
            Return m_Sat
        End Get
        Set
            m_Sat = Value
        End Set
    End Property
End Class

Public Class Training
    Private m_something1 As String
    Private m_something2 As String
    Private m_something3 As String

    Public Property something1() As String
        Get
            Return m_something1
        End Get
        Set
            m_something1 = Value
        End Set
    End Property

    Public Property something2() As String
        Get
            Return m_something2
        End Get
        Set
            m_something2 = Value
        End Set
    End Property

    Public Property something3() As String
        Get
            Return m_something3
        End Get
        Set
            m_something3 = Value
        End Set
    End Property
End Class

Public Class RootObject
    Private m_scheduleName As String
    Private m_firstName As String
    Private m_lastName As String
    Private m_theRole As String
    Private m_linker As String
    Private m_Schedule As Schedule
    Private m_empInfo As EmpInfo
    Private m_availability As Availability
    Private m_training As Training

    Public Property scheduleName() As String
        Get
            Return m_scheduleName
        End Get
        Set
            m_scheduleName = Value
        End Set
    End Property

    Public Property firstName() As String
        Get
            Return m_firstName
        End Get
        Set
            m_firstName = Value
        End Set
    End Property

    Public Property lastName() As String
        Get
            Return m_lastName
        End Get
        Set
            m_lastName = Value
        End Set
    End Property

    Public Property theRole() As String
        Get
            Return m_theRole
        End Get
        Set
            m_theRole = Value
        End Set
    End Property

    Public Property linker() As String
        Get
            Return m_linker
        End Get
        Set
            m_linker = Value
        End Set
    End Property

    Public Property Schedule() As Schedule
        Get
            Return m_Schedule
        End Get
        Set
            m_Schedule = Value
        End Set
    End Property

    Public Property empInfo() As EmpInfo
        Get
            Return m_empInfo
        End Get
        Set
            m_empInfo = Value
        End Set
    End Property

    Public Property availability() As Availability
        Get
            Return m_availability
        End Get
        Set
            m_availability = Value
        End Set
    End Property

    Public Property training() As Training
        Get
            Return m_training
        End Get
        Set
            m_training = Value
        End Set
    End Property
End Class

How can I create a structure for the json.net to serialize when I do not know what the data names will be? I was thinking of a type of List(as String) or even a Dictionary(String, String) but still am unsure how to go about adding those to the class and populating it using the sql data for those values.

So here is what I am asking:

(1) How can I get the class structure to accept sql column names and values when I do not know what those table names will be?

(2) Able to form the json structure as I am wanting from the data in the class functions.

Upvotes: 0

Views: 152

Answers (1)

Brian Rogers
Brian Rogers

Reputation: 129827

Originally I was thinking a Dictionary(Of String, String) would be perfect for this, but it has become clear from your comments that there could be duplicate column names for the training items. Because of this, a Dictionary won't work here, and moreover, the JSON format you want won't work either. You will need to change the training section of the JSON to an array of objects in order to handle the potential duplicates.

Here's how I'm thinking you can make it work:

  1. Change your Training class to have two public properties, Name and Value.

  2. In your RootObject class, define the training property as List(Of Training) instead of a single Training.

    Public Class RootObject
        ...
        Private m_training As List(Of Training)
    
        ...
        Public Property training() As List(Of Training)
            Get
                If m_training Is Nothing Then
                    m_training = New List(Of Training))
                End If
                Return m_training
            End Get
            Set(value As List(Of Training))
                m_training = value
            End Set
        End Property
    End Class
    
  3. In your SQL query, make sure that all the training-related columns come last in the SELECT clause. Since you said the column names don't share a common prefix, they only way I can see to identify them is by position.

    SELECT ID, Name, theRole, THrs, Mon, ..., EMPTR.*
    FROM ...
    
  4. In your reader loop, after populating all the known properties for the row, you can loop over the remaining fields in the reader to populate the list of training items for that row.

    Const firstTrainingColumnIndex As Integer = 5 'Adjust as necessary for your actual data '
    
    Dim i As Integer
    For i = firstTrainingColumnIndex To reader.FieldCount - 1
        trainingItem.Name = reader.GetName(i)
        trainingItem.Value = IIf(reader.IsDBNull(i), Nothing, reader.GetString(i))
        rootObj.training.Add(trainingItem)
    Next
    
  5. To create the JSON output, just serialize like you normally would. Json.Net already knows how to handle a List.

    Dim json as String = JsonConvert.SerializeObject(rootObj, Formatting.Indented)
    

    The output should end up looking like this:

    {
      "scheduleName": "Bob M",
    
      ...
    
      "training": [
        {
          "Name": "trainH1",
          "Value": "168dGrc0"
        },
        {
          "Name": "train58",
          "Value": "89220E"
        },
        {
          "Name": "train52",
          "Value": "2FDEx56"
        },
        {
          "Name": "train05",
          "Value": "5569CCz"
        }
      ]
    }
    

Upvotes: 1

Related Questions