Javascript 构建、发送和反序列化包含数组的json对象

Javascript 构建、发送和反序列化包含数组的json对象,javascript,ajax,serialization,Javascript,Ajax,Serialization,我对JSON真的很陌生,但这里是我得到的。我需要创建一个包含数组/列表和两个平面字段的对象。例如: var names= new Array(); names[0] = "Christy"; names[1] = "Jeremy"; var obj = { names: names, age: "21+", comment: "friends" }; 然后我将其字符串化并尝试通过AJAX将其发送到pagemethod: var jsonData = JSO

我对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);
            }
        });
    }
});
我不确定我是否做对了。它甚至没有进入webmethod,而是直接进入error函数。但为了便于交谈,我在代码背后有以下内容:

[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; }
}
公共类注释
{
公共列表名称{get;set;}
公共字符串年龄{get;set;}
公共字符串注释{get;set;}
}

您的json数据对象不必字符串化。JQuery会自动为其创建一个json对象:

var jsonData = JSON.stringify(obj);
sendData(jsonData);
可以成为:

sendData(obj);
此外,在代码隐藏中,您使用JSON.Net库中的JsonConvert,.Net还有一个名为JavaScriptSerializer的JSON解析器(有些有限)。这样,您就可以使用以下内容:

public static string TestArray(string guids)
{
    JavaScriptSerializer serializer = new JavaScriptSerializer();
    // Deserialize
    Comment cmt = serializer.Deserialize<Comment>(guids);
}
publicstaticstringtestarray(字符串guid)
{
JavaScriptSerializer serializer=新的JavaScriptSerializer();
//反序列化
注释cmt=serializer.Deserialize(guids);
}

您的json数据对象不必字符串化。JQuery会自动为其创建一个json对象:

var jsonData = JSON.stringify(obj);
sendData(jsonData);
可以成为:

sendData(obj);
此外,在代码隐藏中,您使用JSON.Net库中的JsonConvert,.Net还有一个名为JavaScriptSerializer的JSON解析器(有些有限)。这样,您就可以使用以下内容:

public static string TestArray(string guids)
{
    JavaScriptSerializer serializer = new JavaScriptSerializer();
    // Deserialize
    Comment cmt = serializer.Deserialize<Comment>(guids);
}
publicstaticstringtestarray(字符串guid)
{
JavaScriptSerializer serializer=新的JavaScriptSerializer();
//反序列化
注释cmt=serializer.Deserialize(guids);
}

根据web方法的签名:

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 });
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');
    }
});
此外,在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 });
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');
    }
});

此外,为了能够在将来轻松调试此类问题,我强烈建议您使用FireBug等javascript调试工具,该工具将显示您可能存在的任何潜在js错误以及包括AJAX请求在内的所有网络流量。

根据web方法的签名:

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 });
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');
    }
});
此外,在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 });
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');
    }
});

此外,为了能够在将来轻松调试此类问题,我强烈建议您使用FireBug等javascript调试工具,该工具将显示您可能遇到的任何潜在js错误以及包括AJAX请求在内的所有网络流量。

如果您这样做,jQuery将发布一组键/值对仍然不起作用。“内部服务器错误”。如果我从json对象中删除年龄和注释字段,并将其视为webmethod中的列表,则它可以工作。但是我需要数组。如果这样做,jQuery将发布一组键/值对仍然不起作用。“内部服务器错误”。如果我从json对象中删除年龄和注释字段,并将其视为webmethod中的列表,则它可以工作。但是我需要数组。有关在原始帖子正文中发送JSON数据的信息,请参阅。有关在原始帖子正文中发送JSON数据的信息,请参阅