迭代ASP.NET webservice提供的JSON对象列表

时间:2010-11-24 13:00:01

标签: asp.net jquery web-services json generics

我有一个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格式,以便我可以遍历其中的对象元素?

1 个答案:

答案 0 :(得分:1)

您不应手动序列化JSON。如果您这样定义,ScriptService会自动为您执行此操作:

[WebMethod]
public List<Construct> GetConstructList()
{
  return new ConstructList();
}