2013-07-04 6 views
5

Ho un problema molto strano con ServiceStack quando serializzo una classe in JSON - gli oggetti sono vuoti, tuttavia XML funziona correttamente.ServiceStack - json vuoto quando si restituisce la classe

Trovato qualche suggerimento che, serializzatore JSON funziona solo quando le proprietà sono pubbliche, ma come potete vedere qui sotto le mie proprietà sono pubbliche.

Vedere sotto il codice e gli screenshot. Ogni suggerimento è molto apprezzato.


XML enter image description here
JSON enter image description here
GetUsers.aspx.vb

Public Class GetUsersAD 

     Public Property username As String 
     Public Property fullname As String 


     Public Function HandleRequest() 

       Dim _users As New List (Of User) 
      _users = GetUsersTest(_users) 
       Return _users 

     End Function 

     Public Function GetUsersTest(_users As List (Of User)) As List (Of User) 

       Dim dt As New DataTable 
      dt.Columns.Add("username") 
      dt.Columns.Add("fullname") 

       For x As Integer = 0 To 5 

        Dim newUserRow As DataRow = dt.NewRow() 
        newUserRow("username") = "username-" & x & "" 
        newUserRow("fullname") = "fullname-" & x & "" 
        dt.Rows.Add(newUserRow) 

       Next 

       For Each row As DataRow In dt.Rows 

        Dim _user As New User 
        _user.username = row("username") 
        _user.fullname = row("fullname") 
        _users.Add(_user) 

       Next 


       Return _users 

     End Function 

End Class 

Public Class User 

     Public username As String = "" 
     Public fullname As String = "" 


End Class 

Public Class Users 

     Public username As String = "" 
     Public fullname As String = "" 


End Class 

WS.vb

Public Class WrapperGetUsers 

    Implements IService(Of GetUsersAD) 

    Public Property username As String 
    Public Property fullname As String 

    Public Function Execute(ByVal request As GetUsersAD) As Object Implements ServiceStack.ServiceHost.IService(Of GetUsersAD).Execute 

     Return request.HandleRequest() 

    End Function 


End Class 

risposta

9

Per impostazione predefinita, ServiceStack sarà solo serializzare pubblico proprietà, non pubbliche campi, nei vostri DTOs. Quindi è necessario dichiarare username e fullname ciascuna come property nella classe User oppure configurare ServiceStack.Text per serializzare i campi (impostando JsConfig.IncludePublicFields su True).

Si noti che per la serializzazione JSON è utilizzato ServiceStack.Text, mentre per la serializzazione XML viene utilizzato il serializzatore XML BCL. Pertanto, la configurazione e il comportamento della serializzazione XML vs JSON possono differire in questi modi con ServiceStack.

+0

Una volta aggiunte proprietà pubbliche alla classe Utente, tutto funziona correttamente. Grazie per il consiglio. – Iladarsda

+1

Inoltre, sembra che sia possibile rimuovere tali proprietà dalle classi 'GetUsersAD' e' WrapperGetUsers', a meno che non le si utilizzi per altri scopi. Fondamentalmente, non inserire le proprietà che si desidera avere nella richiesta/risposta nelle classi di servizio, inserirle in una classe DTO separata (come la classe 'User'). –

+0

Non ero sicuro di dove dovrei mettere le proprietà così le ho usate ovunque. Grazie per il consiglio. – Iladarsda