2013-05-30 19 views
0

我试图构造POCO类,以便RestSharp可以反序列化特定的JSON结果。 该问题的关键似乎是,根对象同时包含一个nb_results关键字和其他关键字(“0:”,“1:”等每个都具有复数值)的字典。在根元素下包含值和字典的RestSharp反序列化

我已经尝试过Dictionary(Of Integer,mediaGalleryData)和Dictionary(Of String,mediaGalleryData)。两者都不起作用。 nb_results总是序列化,但字典永远不会。

{ 
    "nb_results": 2, 
    "0": { 
    "id": 51976254, 
    "title": "Bumblebee species Bombus terrestris", 
    "media_type_id": 1, 
    "creator_name": "paulrommer", 
    "creator_id": 201446851, 
    "thumbnail_url": "http:\/\/t1.ftcdn.net\/jpg\/00\/51\/97\/62\/110_F_51976254_dVCbgGVey5xEuLkvk1e4vhnmPqxI4J0X.jpg", 
    "thumbnail_html_tag": "<img src=\"http:\/\/t1.ftcdn.net\/jpg\/00\/51\/97\/62\/110_F_51976254_dVCbgGVey5xEuLkvk1e4vhnmPqxI4J0X.jpg\" alt=\"Bumblebee species Bombus terrestris\" title=\"Photo: Bumblebee species Bombus terrestris\" width=\"110\" height=\"73\" \/>", 
    "thumbnail_width": 110, 
    "thumbnail_height": 73, 
    "affiliation_link": "http:\/\/api.fotolia.com\/id\/51976254", 
    "thumbnail_30_url": "http:\/\/t1.ftcdn.net\/jpg\/00\/51\/97\/62\/30_F_51976254_dVCbgGVey5xEuLkvk1e4vhnmPqxI4J0X.jpg", 
    "thumbnail_30_width": 30, 
    "thumbnail_30_height": 20, 
    "thumbnail_110_url": "http:\/\/t1.ftcdn.net\/jpg\/00\/51\/97\/62\/110_F_51976254_dVCbgGVey5xEuLkvk1e4vhnmPqxI4J0X.jpg", 
    "thumbnail_110_width": 110, 
    "thumbnail_110_height": 73, 
    "thumbnail_400_url": "http:\/\/t1.ftcdn.net\/jpg\/00\/51\/97\/62\/400_F_51976254_dVCbgGVey5xEuLkvk1e4vhnmPqxI4J0X.jpg", 
    "thumbnail_400_width": 400, 
    "thumbnail_400_height": 267, 
    "licenses": [ 
     { 
     "name": "XS", 
     "price": 1 
     }, 
     { 
     "name": "S", 
     "price": 3 
     }, 
     { 
     "name": "M", 
     "price": 5 
     }, 
     { 
     "name": "L", 
     "price": 7 
     }, 
     { 
     "name": "XL", 
     "price": 8 
     }, 
     { 
     "name": "XXL", 
     "price": 10 
     }, 
     { 
     "name": "X", 
     "price": 100 
     } 
    ] 
    }, 
    "1": { 
    "id": 44488015, 
    "title": "Vintage Style Birds, Bees and Banners Vector Set", 
    "media_type_id": 3, 
    "creator_name": "artnerdluxe", 
    "creator_id": 203491263, 
    "thumbnail_url": "http:\/\/t1.ftcdn.net\/jpg\/00\/44\/48\/80\/110_F_44488015_hvEpYPw8yILDsnAi6BChYWXtzmiH6jWd.jpg", 
    "thumbnail_html_tag": "<img src=\"http:\/\/t1.ftcdn.net\/jpg\/00\/44\/48\/80\/110_F_44488015_hvEpYPw8yILDsnAi6BChYWXtzmiH6jWd.jpg\" alt=\"Vintage Style Birds, Bees and Banners Vector Set\" title=\"Vector: Vintage Style Birds, Bees and Banners Vector Set\" width=\"105\" height=\"110\" \/>", 
    "thumbnail_width": 105, 
    "thumbnail_height": 110, 
    "affiliation_link": "http:\/\/api.fotolia.com\/id\/44488015", 
    "thumbnail_30_url": "http:\/\/t1.ftcdn.net\/jpg\/00\/44\/48\/80\/30_F_44488015_hvEpYPw8yILDsnAi6BChYWXtzmiH6jWd.jpg", 
    "thumbnail_30_width": 29, 
    "thumbnail_30_height": 30, 
    "thumbnail_110_url": "http:\/\/t1.ftcdn.net\/jpg\/00\/44\/48\/80\/110_F_44488015_hvEpYPw8yILDsnAi6BChYWXtzmiH6jWd.jpg", 
    "thumbnail_110_width": 105, 
    "thumbnail_110_height": 110, 
    "thumbnail_400_url": "http:\/\/t1.ftcdn.net\/jpg\/00\/44\/48\/80\/400_F_44488015_hvEpYPw8yILDsnAi6BChYWXtzmiH6jWd.jpg", 
    "thumbnail_400_width": 380, 
    "thumbnail_400_height": 400, 
    "licenses": [ 
     { 
     "name": "XS", 
     "price": 1 
     }, 
     { 
     "name": "S", 
     "price": 3 
     }, 
     { 
     "name": "M", 
     "price": 5 
     }, 
     { 
     "name": "L", 
     "price": 7 
     }, 
     { 
     "name": "XL", 
     "price": 8 
     }, 
     { 
     "name": "XXL", 
     "price": 10 
     }, 
     { 
     "name": "V", 
     "price": 5 
     }, 
     { 
     "name": "XV", 
     "price": 40 
     } 
    ] 
    } 
} 

这里是班我到目前为止:

Public Class mediaGallery 
    Public Property nb_results As Integer 
    Public Property results As Dictionary(Of String, mediaGalleryData) 
End Class 
Public Class mediaGalleryData 
    Public Property id As Integer 
    Public Property title As String 
    Public Property creator_name As String 
    Public Property creator_id As Integer 
    Public Property media_type_id As Integer 
    Public Property thumbnail_url As String 
    Public Property thumbnail_width As Integer 
    Public Property thumbnail_height As Integer 
    Public Property thumbnail_html_tag As String 
    Public Property thumbnail_30_url As String 
    Public Property thumbnail_30_width As Integer 
    Public Property thumbnail_30_height As Integer 
    Public Property thumbnail_110_url As String 
    Public Property thumbnail_110_width As Integer 
    Public Property thumbnail_110_height As Integer 
    Public Property thumbnail_400_url As String 
    Public Property thumbnail_400_width As Integer 
    Public Property thumbnail_400_height As Integer 
    Public Property licenses As List(Of licensedata) 
End Class 
Public Class licensedata 
    Public Property name As String 
    Public Property price As Integer 
End Class 

我RestSharp耗时代码:

Public Function getUserGalleryMedias(page As Integer?, nb_per_page As Integer?, thumbnail_size As Integer?, id As String, detail_level As Integer?) As mediaGallery 
    Dim request = New RestRequest("user/getUserGalleryMedias", Method.GET) 
    If page.HasValue Then request.AddParameter("page", page.Value) 
    If nb_per_page.HasValue Then request.AddParameter("nb_per_page", nb_per_page.Value) 
    If thumbnail_size.HasValue Then request.AddParameter("thumbnail_size", thumbnail_size.Value) 
    If Not String.IsNullOrEmpty(id) Then request.AddParameter("id", id) 
    If detail_level.HasValue Then request.AddParameter("detail_level", detail_level.Value) 

    Return Execute(Of mediaGallery)(request) 
End Function 
+0

我已经完成了我需要做的,但我不得不去有点长的路周围。正如在RestSharp wiki文档中所建议的(但没有很好地解释),我实现了IDeserializer来专门处理这个类。我不得不单独使用SimpleJson(因为它在RestSharp中标记为Friend)。而不是将我的反序列化器注册为一个处理器,而这需要我的反序列化器处理所有的类,我只是在我的API的Execute(Of T)方法中调用它,只是在T是麻烦的类中。 –

+1

我会以答案的形式输入此内容,但在赏金开放的情况下它不会让我知道。 –

+0

输入您的答案并将其标记为正确:) –

回答

1

我已经完成了我需要做的,但我不得不走了一段很长的路。

正如维基上的RestSharp documentation建议(但没有很好解释),我实现了IDeserializer来专门处理这个类。我必须单独将SimpleJson添加到网站,因为它在RestSharp中标记为Friend。我只是在我的API类的Execute(Of T)方法中调用它,而不是将我的反序列化程序注册为RestClient的处理程序,而这只需要我的反序列化程序来处理所有的类,只是T是麻烦的类。

Execute(Of T)方法:

Public Function Execute(Of T As New)(request As RestRequest) As T 
    Dim client = New RestClient() 

    ' set up client with authenticator 
    client.BaseUrl = BaseURL 
    If String.IsNullOrEmpty(_sessionID) Then 
     client.Authenticator = New HttpBasicAuthenticator(_apikey, "") 
    Else 
     client.Authenticator = New HttpBasicAuthenticator(_apikey, _sessionID) 
    End If 

    ' used on every request 
    Dim response = client.Execute(Of T)(request) 

    ' Check for exceptions or bad status code 
    If response.ErrorException IsNot Nothing Then 
     Throw response.ErrorException 
    ElseIf response.StatusCode > 299 Then 
     If response.Content.StartsWith("{""error""") Then 
      Throw New Exception(String.Format("Status {0} {1} : {2}", response.StatusCode, response.StatusDescription, response.Content)) 
     Else 
      Throw New HttpException(response.StatusCode, response.StatusDescription) 
     End If 
    End If 

    ' Handle troublesome class 
    If GetType(T).Equals(GetType(mediaGallery)) Then 
     Dim fjs As New fotoliaJSONDeSerializer 
     response.Data = fjs.Deserialize(Of T)(response) 
    End If 

    Return response.Data 
End Function 

解串器类:

''' <summary> 
    ''' specific to the FotoliaAPI.mediaGallery we actually want to handle 
    ''' </summary> 
    ''' <param name="response"></param> 
    ''' <returns></returns> 
    ''' <remarks></remarks> 
    Private Function DeserializeMediaLibrary(response As IRestResponse) As FotoliaAPI.mediaGallery 
     Dim result As New FotoliaAPI.mediaGallery 

     ' turn to an iDictionary so we can readily enumerate keys 
     Dim j As IDictionary(Of String, Object) = CType(SimpleJSON.SimpleJson.DeserializeObject(response.Content), IDictionary(Of String, Object)) 

     For Each key In j.Keys 
      ' this top level key is a direct property 
      If key = "nb_results" Then 
       result.nb_results = j(key) 
      Else 
       ' all other keys become members of the list. 
       ' Turn the value back to a string, then feed it back into SimpleJson to deserialize to the strongly typed subclass. 
       result.media.Add(_ 
        SimpleJSON.SimpleJson.DeserializeObject(Of FotoliaAPI.mediaGalleryData)(_ 
         j(key).ToString)) 
      End If 
     Next 

     Return result 

    End Function 

    ' required but unimportant properties of IDeserializer 
    Public Property DateFormat As String Implements Deserializers.IDeserializer.DateFormat 
    Public Property [Namespace] As String Implements Deserializers.IDeserializer.Namespace 
    Public Property RootElement As String Implements Deserializers.IDeserializer.RootElement 
End Class 
相关问题