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

时间:2012-03-28 05:27:41

标签: 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 = 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; }
}

2 个答案:

答案 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);
}