ServiceStack.Text读取json结果不起作用

时间:2014-06-20 04:13:10

标签: json vb.net servicestack json-deserialization servicestack-text

我只想弄清楚反序列化从第三方api调用返回的json字符串的最佳方法。我读的ServiceStack速度很快,所以想试一试。没有经验,这就是我所做的:

  1. 打开Visual Studio 2013
  2. 创建新项目Windows窗体应用程序
  3. 已安装的ServiceStack.Text(基于https://servicestack.net/download
  4. 添加了一个按钮(btnView)和文本框(txtOutput)
  5. 将代码添加到btnView_Click事件

           Private Sub btnView_Click(sender As Object, e As EventArgs) Handles btnView.Click
    
        Me.Cursor = Cursors.WaitCursor
    
        Dim wp As New WebPost 'this allows to pass url and return results
        wp.URL = "xxxx"
        Dim sJSONRetVal As String = wp.Request(String.Empty, True)
    'sJSONRetVal return values looks like the following:
    '{"complaints":[{"feedback_type":"abuse","subject":"Sales Agent Position"},{"feedback_type":"abuse","subject":"Sales Agent Position"}],"message":"OK","code":0}
    
    
        'ServiceStack.Text example
        Dim t As SMTP_Complaints = ServiceStack.Text.JsonSerializer.DeserializeFromString(Of SMTP_Complaints)(sJSONRetVal)
    
        'For Each xi As SMTP_Complaints In t
        '    txtOutput.Text &= xi.mail_from & vbCrLf
        'Next
    
        wp = Nothing
    
        txtOutput.Text = t.ToString
    
        Me.Cursor = Cursors.Default
    
    End Sub
    
    Public Class SMTP_Complaints
    
    Dim _feedback_type As String = ""
    Dim _subject As String = ""
    
    Public Property feedback_type As String
        Get
            Return _feedback_type
        End Get
        Set(value As String)
            _feedback_type = value
        End Set
    End Property
    
    Public Property subject As String
        Get
            Return _subject
        End Get
        Set(value As String)
            _subject = value
        End Set
    End Property
    End Class
    
  6. 以上似乎没有得到任何数据。如何循环返回的数据并从两个实例返回数据?只是不确定我需要如何设置它来读取json数据然后才能输出。

1 个答案:

答案 0 :(得分:3)

基于返回的JSON:

{"complaints":[{"feedback_type":"abuse","subject":"Sales Agent Position"},{"feedback_type":"abuse","subject":"Sales Agent Position"}],"message":"OK","code":0}

您需要两个DTO来反序列化此结果。

我在这里使用了auto implemented properties来简化代码的复杂性。如果您使用旧版本的VB,则需要将这些版本扩展为包含带有get和set方法的支持字段。

Public Class SMTP_Complaint
    Public Property feedback_type As String
    Public Property subject As String
End Class

Public Class SMTP_ComplaintsResponse
    Public Property complaints As SMTP_Complaint()
    Public Property message As String
    Public Property code As Integer
End Class

您需要SMTP_ComplaintsResponse课程,因为您的投诉包含在您的JSON回复中。

然后对响应进行反序列化:

Dim response = JsonSerializer.DeserializeFromString(Of SMTP_ComplaintsResponse)(sJSONRetVal)

然后您可以访问您的投诉:

For Each complaint As var In response.complaints
    Console.WriteLine("Type: {0}, Subject {1}", complaint.feedback_type, complaint.subject)
Next