2017-06-01 32 views
0

序列化列表餘米試圖手藝我從一個WebMethod在JSON的形式從名單響應結合,處理和VB.NET

首先列表屬性

Public Class DataRes 
    Public Property RecID As Integer 
    Public Property filenum As Integer 
    Public Property name As String 
    Public Property msgcode As String 
    Public Property msgtitle As String 
    Public Property msg As String 
    Public Property PartnerData As List(Of PartnerData) 
End Class 

我的第二個列表屬性

Public Class PartnerData 
    Public Property RecID As Integer 
    Public Property PrtStatus As Integer 
    Public Property ptfilenum As Integer 
    Public Property prfilenum As Integer 
End Class 

我填寫那些清單,分別如下面的代碼

Dim Ptdata As New List(Of DataRes)() 
 
Using sdr As SqlDataReader = cmd.ExecuteReader() 
 
        While sdr.Read() 
 
         Ptdata.Add(New DataRes() With { _ 
 
         .RecID = sdr("RecID").ToString(), _ 
 
         .filenum = sdr("filenum").ToString(), _ 
 
         .name = sdr("name").ToString() _ 
 
         }) 
 
        End While 
 
       End Using 
 
return JsonConvert.SerializeObject(Ptdata) 
 

 

 
Dim Prtdata As New List(Of PartnerData)() 
 
Using sdr As SqlDataReader = cmd.ExecuteReader() 
 
        While sdr.Read() 
 
         Prtdata.Add(New PartnerData() With { _ 
 
         .prfilenum = sdr("PrtFilenum").ToString(), _ 
 
         .PrtStatus = sdr("PrtStatus").ToString(), _ 
 
         .ptfilenum = sdr("PtFilenum").ToString(), _ 
 
         .RecID = sdr("RecID").ToString() _ 
 
         }) 
 
        End While 
 
       End Using 
 
return JsonConvert.SerializeObject(PartnerData)

我測試的兩種列表和我米從每個

我米試圖將它們結合起來得到所期望的結果,我試圖下面,

  1. 昏暗合併= Ptdata .Concat(Prtdata).ToList() 我得到這個錯誤,

無法投型的對象「system.collections.generic.list`1

  • 昏暗合併= Ptdata.AddRange(Prtdata).ToList() 和我得到這個錯誤,
  • 表達式不會產生一個值。

    我的目標JSON會是這樣的

    { 
    "PtRegData": { 
        "RecID": "1277", 
        "filenum": "15090248", 
        "name": "Ahmad", 
    
        "PartnerData": [{ 
         "RecID": 2383, 
         "PrtStatus": 1 
        }, { 
         "RecID": 3387, 
         "PrtStatus": 0 
        }, { 
         "RecID": 3388, 
         "PrtStatus": 0 
        }] 
    }} 
    

    另外,我怎麼可以添加一個名稱列表之前序列化呢?

    編輯

    Using sdr As SqlDataReader = cmd.ExecuteReader() 
     
            While sdr.Read() 
     
             Ptdata.Add(New DataRes() With { _ 
     
             .RecID = sdr("RecID").ToString(), _ 
     
             .filenum = sdr("filenum").ToString(), _ 
     
             .name = sdr("name").ToString(), _ 
     
             .msgcode = sdr("msgcode").ToString(), _ 
     
             .msgtitle = sdr("msgtitle").ToString(), _ 
     
             .msg = sdr("msg").ToString() _ 
     
             }) 
     
            End While 
     
           End Using 
     
           
     
           Using sdr As SqlDataReader = cmd.ExecuteReader() 
     
            While sdr.Read() 
     
             Prtdata.Add(New PartnerData() With { _ 
     
             .prfilenum = sdr("PrtFilenum").ToString(), _ 
     
             .PrtStatus = sdr("PrtStatus").ToString(), _ 
     
             .ptfilenum = sdr("PtFilenum").ToString(), _ 
     
             .RecID = sdr("RecID").ToString() _ 
     
             }) 
     
            End While 
     
            For Each p In Ptdata 
     
             p.PartnerData.AddRange(Prtdata.Where(Function(c) c.ptfilenum = p.filenum)) 
     
            Next 
     
           End Using

    +0

    您將需要一個項目類型有一個屬性,它是其他項目類型的列表,那麼你就需要填充該集合爲每個項目從其他列表。你不能只將這兩個列表端到端地粘在一起,並期望它神奇地創建這種關係。 – jmcilhinney

    +0

    @jmcilhinney,謝謝你的迴應,我更新了類,我仍然得到相同的錯誤,,,無法投出類型的對象'system.collections.generic.list'1 – JSON

    +1

    你寫代碼添加'PartnerData'對象與它們相關的'DataRes'對象的'PartnerData'集合? – jmcilhinney

    回答

    1

    讓我們假設你有這些類型:

    Public Class Parent 
    
        Public Property ParentId As Integer 
    
        Public Property ParentName As String 
    
        Public ReadOnly Property Children As New List(Of Child) 
    
    End Class 
    
    
    Public Class Child 
    
        Public Property ChildId As Integer 
    
        Public Property ParentId As Integer 
    
        Public Property ChildName As String 
    
    End Class 
    

    的名稱和屬性並不真正的問題。只有父母/子女關係很重要。父類型具有屬性,該屬性是子類型的集合。假設你有父母和孩子的物品兩個列表:

    Dim parents As New List(Of Parent) 
    Dim children As New List(Of Child) 
    

    可以填充每個Parent對象的Children屬性,像這樣:

    For Each p In parents 
        p.Children.AddRange(children.Where(Function(c) c.ParentId = p.ParentId)) 
    Next 
    

    如果你喜歡長手版本:

    For Each p In parents 
        For Each c In children 
         If c.ParentId = p.ParentId Then 
          p.Children.Add(c) 
         End If 
        Next 
    Next 
    

    編輯:早期版本的VB(早於2017年)可能不支持上述只讀屬性的語法。下面的代碼應在所有版本:

    Public Class Parent 
    
        Public _children As New List(Of Child) 
    
        Public Property ParentId As Integer 
    
        Public Property ParentName As String 
    
        Public ReadOnly Property Children As List(Of Child) 
         Get 
          Return _children 
         End Get 
        End Property 
    
    End Class 
    
    +0

    我明白,謝謝,但在我的情況下,兩個列表沒有共同的記錄,我怎麼才能附加結果,而不創建屬性之間的關係,如在c.ParentId = p.ParentId – JSON

    +0

    對不起,如果我不適當解釋自己但是我上面的JSON可能更有用 – JSON

    +0

    你的JSON表明一個'DataRes'對象是相關'PartnerData'對象的父對象。如果您無法確定哪些與哪個關聯,那麼您如何輸出顯示這些關係的JSON? – jmcilhinney