SQL数据到自定义JSON.net结构

时间:2016-05-31 05:29:04

标签: sql-server json vb.net json.net

嘿所有我有以下SQL查询输出以下内容:

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

理想情况下,我希望结构看起来像这样[注意:下面有其他表名]:

{
    "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": {
        "?": "?"
    }
}

列车是我遇到问题的地方。数据库中的这些值可以在任何给定时间更改名称,也可以添加或删除。目前我有大约35个值。因此,我无法在类功能硬编码这些值,因为我可以使用 ID 名称 theRole THrs 等...

VB.net 类定义看起来像到目前为止

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

当我不知道数据名称是什么时,如何为json.net创建一个序列化结构?我在想一种 List(作为字符串),甚至是字典(字符串,字符串),但仍然不确定如何将这些添加到类中并填充它使用sql数据表示这些值。

所以这就是我的要求:

  

(1)当我不知道那些表名是什么时,如何让类结构接受sql列名和值?

     

(2)能够从类函数中的数据中形成json结构。

1 个答案:

答案 0 :(得分:1)

最初我认为Dictionary(Of String, String)对此非常适合,但从您的评论中可以清楚地看出,培训项目可能存在重复的列名。因此,字典在这里不起作用,而且,您想要的JSON格式也不起作用。您需要将JSON的training部分更改为对象数组,以便处理潜在的重复项。

以下是我认为你可以让它发挥作用的方式:

  1. 将您的Training课程更改为两个公共媒体资源NameValue

  2. RootObject课程中,将training属性定义为List(Of Training),而不是单个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. 在SQL查询中,确保所有与培训相关的列在SELECT子句中排在最后。既然你说列名不共享一个共同的前缀,那么我只能看到它们的位置。

    SELECT ID, Name, theRole, THrs, Mon, ..., EMPTR.*
    FROM ...
    
  4. 在您的阅读器循环中,在填充行的所有已知属性后,您可以遍历阅读器中的其余字段以填充该行的培训项目列表。

    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. 要创建JSON输出,只需像往常一样进行序列化。 Json.Net已经知道如何处理List

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

    输出应该看起来像这样:

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