我有一个ASP.NET webservice方法,它返回一个通用列表(List'<'Construct>),序列化为JSON,使用如下代码:
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class TestService : System.Web.Services.WebService {
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string GetOccupationListJSON(int SOCLevel)
{
Construct NewConstructList = new ConstructList();
DataContractJsonSerializer serializer = new DataContractJsonSerializer(ConstructList.GetType());
MemoryStream ms = new MemoryStream();
serializer.WriteObject(ms, NewConstructList);
string json = Encoding.Default.GetString(ms.ToArray());
return json;
}
}
然后我使用jQuery调用此方法,并获取JSON数据,如下所示:
function GetCustomerList() {
$.ajax({
type: "POST",
url: "/WebService.asmx/GetConstructList",
data: "{}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (data) { LoadConstructData(data.d); },
failure: function() { alert("Sorry, we were unable to find the constructs."); }
});
}
JSON结果如下所示:
[
{
"ConstructLabel": "Construct label 1",
"ConstructType": 2,
},
{
"ConstructLabel": "Construct label 2",
"ConstructType": 3,
}
]
然后我想迭代JSON数据中ConstructList中的元素。这是在jQuery Ajax调用成功时调用的函数:
function LoadConstructData(data) {
for (var i = 0, len = data.length; i < len; ++i) {
var Construct = data[i];
var ConstructLabel = Construct.ConstructLabel
var ConstructType = Construct.ConstructType;
}
}
我假设(从其他地方看)通过索引访问JSON数据将使我能够访问该索引处的底层对象,以便我可以使用它来访问其属性。
但是,当i=0
和我做var Construct = data[i];
时,我得到数据数组的i位置的字符([),并在下一次迭代中得到第二个字符({)。很明显,我正在访问字符串数组的元素而不是JSON数据对象
如何确保Web服务返回的数据变为正确的JSON格式,以便我可以遍历其中的对象元素?
答案 0 :(得分:1)
您不应手动序列化JSON。如果您这样定义,ScriptService会自动为您执行此操作:
[WebMethod]
public List<Construct> GetConstructList()
{
return new ConstructList();
}