2013-07-04 10 views
5

Ich habe ein sehr seltsames Problem mit ServiceStack beim Serialisieren einer Klasse zu JSON - Objekte sind leer, aber XML funktioniert gut.ServiceStack - leere JSON beim Zurückgeben der Klasse

Einige Vorschläge gefunden, dass JSON Serializer nur funktioniert, wenn Eigenschaften öffentlich sind, aber wie Sie unten sehen können, sind meine Eigenschaften öffentlich.

Bitte siehe unten den Code und Screenshots. Jeder Vorschlag wird sehr geschätzt.


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 

Antwort

9

Standardmäßig wird ServiceStack nur serialisiert öffentliche Eigenschaften, nicht öffentlich Felder, in Ihrem DTOs. Sie müssen entweder username und fullname jeweils als property in Ihrer User Klasse deklarieren oder ServiceStack.Text konfigurieren, um Felder zu serialisieren (indem Sie JsConfig.IncludePublicFields auf True setzen).

Beachten Sie, dass für die JSON-Serialisierung ServiceStack.Text verwendet wird, während für die XML-Serialisierung der XML-Serializer von BCL verwendet wird. Daher kann die Konfiguration und das Verhalten von XML gegenüber JSON-Serialisierung auf diese Art und Weise mit ServiceStack variieren.

+0

Sobald der Benutzerklasse 'öffentliche Eigenschaften hinzugefügt wurden, funktioniert alles. Danke für den Tipp. – Iladarsda

+1

Es sieht auch so aus, als könnten Sie diese Eigenschaften aus den Klassen "GetUsersAD" und "WrapperGetUsers" entfernen, es sei denn, Sie verwenden sie für einen anderen Zweck. Stellen Sie die Eigenschaften, die Sie in Ihrer Anfrage/Antwort haben möchten, grundsätzlich nicht in Ihre Serviceklassen, sondern in eine separate DTO-Klasse (z. B. Ihre "User" -Klasse). –

+0

Ich war nicht sicher, wo ich die Eigenschaften setzen sollte, also benutzte ich sie überall. Danke für den Tipp. – Iladarsda

Verwandte Themen