我有一个webmethod,它将读取csv文件中的第一行以获取列标题,然后将每个项目存储在列表中,我将返回到ajax调用。这是代码:
[WebMethod]
public static string getAvailableSensors()
{
List<string> sensors = new List<string>();
try
{
string path = "C:\\.....\\TestData3.csv";
string line;
using (StreamReader sr = new StreamReader(path))
{
line = sr.ReadLine();
sensors = line.Split(',').ToList();
}
}
catch (Exception ex)
{
string error = ex.Message;
}
JavaScriptSerializer jss = new JavaScriptSerializer();
string output = jss.Serialize(sensors);
return output;
}
这是返回到ajax调用时的数据:
这就是我的ajax的样子:
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
url: "WebSockets.aspx/getAvailableSensors",
async: false,
data: "{ }", // send an empty object for calls with no parameters
success: function (result) {
debugger;
data = result.d;
for (var i in result.d) {
sensors.push(result.d[i]);
}
},
error: function (xhr, ajaxOptions, thrownError) {
alert("an error has occured: " + xhr.responseText);
}
});
但这只是一次填充数组1个字符,这不是我想要做的。
我无法弄清楚如何迭代该死的json,以便我可以用列填充我的var sensors = new Array();
。 ex(传感器[0]应为“Time”,传感器[1]应为“X Accel LH”)等。
答案 0 :(得分:4)
首先,您需要将该字符串作为对象。使用jQuery.parseJSON()
将其设为对象。
data=jQuery.parseJSON(data);
在您的情况下,您可以使用像字符串数组
这样的数据答案 1 :(得分:1)
在您的AJAX选项中,您应该设置dataType: 'json'
,以便在传递回调之前响应自动转换为JSON。这可能是您对contentType
的期望,但实际上它设置了发送内容的类型,而不是您期望返回的内容。您可能还想应用ScriptMethodAttribute
并指定返回的结果是JSON - 我相信这会设置Content-Type
标头,以便jQuery可以在您的选项中没有指定格式时自动检测格式
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public static string getAvailableSensors()
{
...
}
的JavaScript
$.ajax({
type: "POST",
dataType: "json", // <-- this
contentType: "application/json; charset=utf-8",
url: "WebSockets.aspx/getAvailableSensors",
async: false,
data: "{ }", // send an empty object for calls with no parameters
success: function (result) {
debugger;
data = result.d;
for (var i in result.d) {
sensors.push(result.d[i]);
}
},
error: function (xhr, ajaxOptions, thrownError) {
alert("an error has occured: " + xhr.responseText);
}
});
如果您使用的是较新版本的jQuery,可能需要考虑使用done
和fail
方法替换成功和错误回调。
$.ajax({
type: "POST",
dataType: "json", // <-- this
contentType: "application/json; charset=utf-8",
url: "WebSockets.aspx/getAvailableSensors",
async: false,
data: "{ }", // send an empty object for calls with no parameters
})
.done(function(result) {
debugger;
data = result.d;
for (var i in result.d) {
sensors.push(result.d[i]);
}
})
.fail(function(xhr, status, error) {
alert("an error has occured: " + xhr.responseText);
});
答案 2 :(得分:0)
您只需从网络方法返回IList<string>
,而不是手动序列化。
[WebMethod]
public static IList<string> getAvailableSensors()
{
List<string> sensors = new List<string>();
string path = "C:\\.....\\TestData3.csv";
string line;
using (StreamReader sr = new StreamReader(path))
{
line = sr.ReadLine();
sensors = line.Split(',').ToList();
}
return sensors;
}
此外,您的错误处理不正确。对于客户端,即使服务器端出错,操作也会成功。我刚刚删除了你试试catch让异常传播到客户端。