VB.NET JSON 对象问题
Posted
技术标签:
【中文标题】VB.NET JSON 对象问题【英文标题】:VB.NET JSON Object Issue 【发布时间】:2011-06-24 16:21:40 【问题描述】:更新:所以我想通了!我所要做的就是使用 jQuery.parseJSON();
并将 JSON 字符串转换为 JSON 对象。这是更新的代码:
$.ajax(
type: "POST",
url: "GetEEs.aspx/GetNextEEs",
data: "recordID:" + lastItem + "",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg, textStatus, jqXHR)
var jObject = jQuery.parseJSON(msg.d);
ddl.length = 0;
$.each(jObject.d, function ()
$.each(this, function (index, item)
addItemToDDL(ddl, item.Display, item.Value);
);
);
,
error: function (xhr, ajaxOptions, thrownError)
alert(xhr.status);
alert(thrownError);
);
好的,我编写了一个函数来查询表并返回数据集,然后将其转换为 JSON,以便页面可以使用它。函数如下:
<WebMethod()> _
Public Shared Function GetNextEEs(ByVal recordID As Integer) As ArrayList
If Not recordID.Equals(0) Then
Dim sql As String = "SELECT TOP 500 * FROM cbotest WHERE ID > " & recordID
Dim arr As New ArrayList
Using dr As SqlDataReader = Mangrove.SqlHelper.ExecuteReader("...")
While dr.Read()
arr.Add(New ArrayList() From _
New With _
Key .Value = dr("code").ToString, _
Key .Display = dr("description").ToString _
)
End While
End Using
Return arr
Else
Throw New ApplicationException("Invalid Record ID")
End If
End Function
该函数在 .Net 4 中运行良好,但我无法在 .Net 2 中使用它。所以我找到了一个名为 Jayrock 的 JSON.Net 对象。我改变了我的功能来使用它,一切正常。这是修改后的函数:
<WebMethod()> _
Public Shared Function GetNextEEs(ByVal recordID As Integer) As String
If Not recordID.Equals(0) Then
Dim sql As String = "SELECT TOP 500 * FROM cbotest WHERE ID > " & recordID
Dim json As JsonObject = New JsonObject()
Dim items As JsonArray = New JsonArray()
Using dr As SqlDataReader = Mangrove.SqlHelper.ExecuteReader("...")
While dr.Read()
Dim item As JsonArray = New JsonArray()
Dim itemArr As JsonObject = New JsonObject()
itemArr.Add("Value", dr("code").ToString)
itemArr.Add("Display", dr("description").ToString)
item.Add(itemArr)
items.Add(item)
End While
End Using
json.Add("d", items)
Using writer As JsonWriter = New EmptyJsonWriter()
json.Export(writer)
Return json.ToString
End Using
Else
Throw New ApplicationException("Invalid Record ID")
End If
End Function
唯一的问题是当它返回 JSON 时,页面无法解析它。
以下是两个函数的输出示例:
第一个版本:
[object Object],[object Object],[object Object], ...
修订版:
"d":[["Value":"501","Display":"Record Number 501"],["Value":"502","Display":"Record Number 502"], ...
如您所见,修改后的版本返回一个实际的字符串(包含正确的数据),而第一个版本返回一个 JSON 对象。我知道这是因为函数以 String
的形式返回,但对于我来说,我无法弄清楚如何使用修改后的代码返回 JSON 对象。
有没有人知道如何做到这一点,或者更好的解决方案?我难住了!另外,请记住,这是针对 .Net 2 的(糟糕,我知道:/)
感谢您的宝贵时间!
编辑 这是我正在使用的一些客户端代码:
$.ajax(
type: "POST",
url: "GetEEs.aspx/GetNextEEs",
data: "recordID:" + lastItem + "",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg, textStatus, jqXHR)
//alert(msg.d);
document.getElementById('lbl').innerhtml = msg.d;
ddl.length = 0;
$.each(msg.d, function ()
$.each(this, function (index, item)
addItemToDDL(ddl, item.Display, item.Value);
);
);
,
error: function (xhr, ajaxOptions, thrownError)
alert(xhr.status);
alert(thrownError);
);
我在最里面的循环中有一个alert(item);
。它正在逐个字母地遍历字符串。
【问题讨论】:
我们能看到一些客户端代码吗? 添加了客户端代码,但这不应该改变也不需要改变,对吗?它以前可以工作,我唯一改变的是GetNextEEs
函数。
我认为WebMethod
会自动将d
属性添加到响应中。但 Jayrock 还将 d
属性添加到 JSON。所以 Jayrock 不喜欢 WebMethod
。我想你应该在客户端做$.each(msg.d.d, function () ...
。
我刚试过,不幸的是它显示undefined
:/ 不过感谢您的建议!
我想通了!我创建了一个新的 var 并使用了 jQuery.parseJSON(msg.d);
并将 JSON 字符串转换为 JSON 对象。是的!哇!哈哈。
【参考方案1】:
$.ajax(
type: "POST",
url: "GetEEs.aspx/GetNextEEs",
data: "recordID:" + lastItem + "",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg, textStatus, jqXHR)
var jObject = jQuery.parseJSON(msg.d);
ddl.length = 0;
$.each(jObject.d, function ()
$.each(this, function (index, item)
addItemToDDL(ddl, item.Display, item.Value);
);
);
,
error: function (xhr, ajaxOptions, thrownError)
alert(xhr.status);
alert(thrownError);
);
【讨论】:
以上是关于VB.NET JSON 对象问题的主要内容,如果未能解决你的问题,请参考以下文章
从android解析jsonObject并在webservice vb.net中获取它