2016-05-31 44 views
0

嘿所有我有输出下面的下面的SQL查询:SQL数据定制JSON.net结构

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名称theRoleTHRS等做...

的VB。净类定义看起来像这样到目前为止

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序列化创建一个结构?我正在考虑一种类型的列表(字符串)甚至字典(字符串,字符串)但仍然不确定如何去添加这些类,并使用这些值的SQL数据填充它。

所以这是我问:

(1)我怎样才能获得阶级结构接受SQL列名和值的时候,我不知道这些表的名称是什么? (2)能够形成json结构,因为我想从类函数中获取数据。

+0

如何你现在在读的SQL数据为你做知道的名字其他值? –

+0

只需使用常规的SQLReader循环。 – StealthRT

回答

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" 
        } 
        ] 
    } 
    
+0

那里有一个很好的例子,Brian!但是,训练部分在所有的行中都不会有“火车”这个词,所以我不能仅仅通过找到这个词去。有没有办法获得行名称作为其循环? – StealthRT

+0

由于这是我要求获取所有数据的查询的一部分** [dbo]。[training]作为EMPTR **。所以我打电话给它** EMPTR **并在我的* select *我有** EMPTR。***。是否有可能获得开始** EMPTR + columnName **? – StealthRT

+0

阅读者看到的列名称是他们在SQL查询中的内容。所以如果你选择了train58作为EMPTR,那么读者将会看到'EMPTR'而不是'train58'。如果EMPTR是表(而不是列)的别名,那么否,读者不会将表别名视为列名的一部分。要使用上述方法,您需要一些常用方法来识别与培训相关的列。如果你不能用名字来做,你可以按位置来做吗?换句话说,你是否可以在所有知名专栏之后制作所有可变培训专栏? (续) –