我是JSON的新手,但这就是我所得到的。我需要创建一个包含数组/列表和几个平面字段的对象。例如:
var names= new Array();
names[0] = "Christy";
names[1] = "Jeremy";
var obj = {
names: names,
age: "21+",
comment: "friends"
};
然后我将其字符串化并尝试通过AJAX将其发送到pagemethod:
var jsonData = JSON.stringify(obj);
sendData(obj);
然后发送:
function sendData(jsonData) {
$.ajax({
type: "POST",
url: "Default.aspx/TestArray",
data: jsonData,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg) {
alert('win');
},
error: function (a, b, ex) {
alert('fail');
}
});
}
所以一起:
$(document).ready(function () {
$("#btnSubmit").click(function (e) {
e.preventDefault();
var names = new Array();
names[0] = "Christy";
names[1] = "Jeremy";
var obj = {
names: names,
age: "21+",
comment: "friends"
};
var jsonData = JSON.stringify(obj);
sendData(jsonData);
});
function sendData(jsonData) {
$.ajax({
type: "POST",
url: "Default.aspx/TestArray",
data: jsonData,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg) {
alert(msg.d);
},
error: function (a, b, ex) {
alert("oops: " + ex);
}
});
}
});
我不确定我是否正确行事。它甚至没有进入web方法,而是直接进入错误功能。但只是为了对话,这就是我在代码隐藏中所拥有的:
[WebMethod()]
public static string TestArray(string guids)
{
Comment cmt = (Comment)JsonConvert.DeserializeObject(guids, typeof(Comment));
return "Winner";
}
当然课程我试图反序列化:
public class Comment
{
public List<string> names { get; set; }
public string age { get; set; }
public string comment { get; set; }
}
答案 0 :(得分:2)
根据您网络方式的签名:
public static string TestArray(string guids)
您必须发送单个字符串参数,而您发送的是一个不匹配的完整复杂JSON对象。所以:
var jsonData = JSON.stringify({ guids: 'foo bar' });
现在,如果您想发送复杂的结构,请使用:
public static string TestArray(Comment comment)
然后:
var names = new Array();
names[0] = "Christy";
names[1] = "Jeremy";
var obj = {
names: names,
age: "21+",
comment: "friends"
};
var jsonData = JSON.stringify({ comment: obj });
同样在您的Web方法内部不进行任何JSON序列化/反序列化。这是框架为您处理的基础架构。所以回顾一下:
[WebMethod]
public static string TestArray(Comment comment)
{
return "Winner";
}
然后:
var names = new Array();
names[0] = "Christy";
names[1] = "Jeremy";
var obj = {
names: names,
age: "21+",
comment: "friends"
};
var jsonData = JSON.stringify({ comment: obj });
$.ajax({
type: "POST",
url: "Default.aspx/TestArray",
data: jsonData,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg) {
// Notice the .d property. That's ASP.NET PageMethods
// serialize the response.
alert(msg.d);
},
error: function (a, b, ex) {
alert('fail');
}
});
另外为了能够在将来轻松调试此类问题,我强烈建议您使用一个javascript调试工具,如FireBug,它会显示您可能遇到的任何潜在js错误以及包括AJAX在内的所有网络流量请求。
答案 1 :(得分:-1)
您的json数据对象不必是字符串化。 JQuery自动为它创建一个json对象:
var jsonData = JSON.stringify(obj);
sendData(jsonData);
可以成为:
sendData(obj);
此外,在您使用JSON.Net库中的JsonConvert后面的代码中,.NET还有一个(有点限制的)JSON解析器,名为JavaScriptSerializer。这样你可以使用类似的东西:
public static string TestArray(string guids)
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
// Deserialize
Comment cmt = serializer.Deserialize<Comment>(guids);
}