JSON响应未正确报告

时间:2015-07-24 17:27:12

标签: json vb.net

我使用newtonsoft.dll来处理来自网站的正确JSON响应,我遇到了一个问题,删除代码:

    Dim delPro As String
    Dim resPro As String
    Dim sB As New StringBuilder()
    For Each row As DataGridViewRow In dataGridProjects.Rows
        If (row.Cells(4).Value IsNot Nothing) Then
            ' JSON
            delPro = srFunctions.postURL("http://www.ste.com/ajax_task.php?act=add&task=projectDelete", "project_ids=" + row.Cells(0).Value.ToString(), varCookieJar)
            resPro = srFunctions.postURL("http://www.ste.com/ajax_task.php?act=status&task=projectDelete", "", varCookieJar)

            ' purely for debugging
            sB.Append("1: " + delPro)
            sB.Append(Environment.NewLine + "----------------------------------------------------------------" + Environment.NewLine)
            sB.Append("2: " + resPro)
            sB.Append(Environment.NewLine + "----------------------------------------------------------------" + Environment.NewLine)

            ' responses
            Dim tempPost = New With {Key .message = "", Key .error = 0, Key .done = False, Key .jsdata = ""}
            Dim obj = JsonConvert.DeserializeAnonymousType(resPro, tempPost)
            Dim com As String = obj.message
            Dim obj2 = JsonConvert.DeserializeObject(Of saperJsonObject)(resPro)

            If CBool((CStr(obj2.done))) Then
                dataGridProjects.Rows.Remove(row)
                Me.returnMessage("Project has been deleted!")
            Else
                dataGridProjects.Rows.Remove(row)
                Me.returnMessage("Site returned an unknown response! (The action still most likely was executed)" & vbCrLf & vbCrLf & "Returned response was: " & (CStr(obj2.done)))
            End If
        End If
    Next

该网站返回2个不同的成功回复,其中一个:

{"错误":0,"完成":0,"消息":" \ u0412 \ u044b \ u043f \ u043e \ u043b \ u043d \ u044f \ u0444 \ u0441 \ u044f \ u0433 \ u0430 \ u0434 \ u0430 \ u043d \ u0438 \ u0435:0/1","数据":[true,true,0,1 ]}

true,true,0,1 在结束时成功(动作仍然完成)另一个看起来像:

{"错误":0,"完成":1}

或类似,完成:1也表示成功,我不知道如何查找两个成功值,我知道我需要在这里编辑:如果CBool​​((CStr(obj2.done)))然后我不确定该怎么做。

任何帮助都会很棒!

欢呼声

格雷厄姆

1 个答案:

答案 0 :(得分:1)

如果没有类结构,DeserializeObject会出现问题(resPro至少定义为String)。它有效,您可以获得done属性,但需要Option Strict Off,这通常不是一个好主意。

如果您需要了解该状态,也可以解析响应。

Public Class Russianobject
    <JsonProperty("error")>
    Public Property JError As Integer
    Public Property done As Boolean
    Public Property message As String
    Public Property data As Object()      ' object array
End Class

这就是较长的邮件的样子(你没有发布你的saperJsonObject看起来像什么)。我不得不更改Error属性,因为它是VB中的保留字。另外,我将doneInt32更改为Boolean。最后一项,数据只是一个对象数组,不清楚你需要哪个元素。

即使短回复没有所有这些元素,您也可以使用相同的类,message将为空,data将为Nothing,因此您必须检查!

Dim jstr = from whereever russian objects come from

Dim jobj = JsonConvert.DeserializeObject(Of Russianobject)(jstr)

If jobj.data IsNot Nothing Then
    Console.WriteLine("0: {0}, 1: {1}, 2:{2}, 3: {2}", jobj.data(0),
                  jobj.data(1), jobj.data(2), jobj.data(3))
Else
    Console.WriteLine(jobj.done)
End If

无论你得到长时间或短暂的回答,这都应该有效。要简单地解析它,你不需要一个类:

' using the short one:
jstr =...from whereever   

jp = JObject.Parse(jstr)
Dim jd = jp.SelectToken("data")
If jd IsNot Nothing Then
    Console.WriteLine("0: {0}, 1: {1}, 2:{2}, 3: {2}", jd(0), jd(1), jd(2), jd(3))
Else
    Console.WriteLine("done = " & Convert.ToBoolean(jp("done")))
End If

请注意,在这种情况下,属性名称就像键一样使用。

输出:

  

0:真,1:真,2:0,3:0
  完成= 1

长响应导致第一个,短结果导致第二个。无论您是使用类还是反序列化对象或只是解析它,您都必须检查data Nothing元素(如图所示),因为它在短响应中不存在。