我使用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)))然后我不确定该怎么做。
任何帮助都会很棒!
欢呼声
格雷厄姆
答案 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中的保留字。另外,我将done
从Int32
更改为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
元素(如图所示),因为它在短响应中不存在。