JSON.NET解析完整键值对作为键

时间:2015-05-07 13:55:47

标签: c# json json.net asp.net-web-api2 custom-attributes

我为我的一个通过AJAX调用处理表单数据的控制器滚动自己的ValidateAntiForgeryToken Web API 2.2属性。

我将数据作为JSON发送到我的控制器,它看起来像这样(来自Fiddler):

{"__RequestVerificationToken":"E8EoBCaFbqSOXhQZiuM93jciTcOAYeLjZj682-3SZRaQ6OOtrm-caZI_IWnX1FH_nwe_AuWnWwxy5ulS0Ynz0STlNptqN09Lu69HxyTeA9PUln8h73yjahB24QPxqI010","ProjectInfo.Description":"Test Description 2"}

我试图获取这样的__RequestVerificationToken数据,但它不起作用:

JToken json = (JToken)actionContext.ActionArguments["json"];
formToken = (string)json["__RequestVerificationToken"];

formToken保持包含空值,因此通过一些调试我发现整个JSON值被视为一个Key,其值为空值,如下面的屏幕截图所示:

Values as Keys

我不确定为什么会这样,因为JSON似乎有效。 Fiddler能够解析JSON而不会出现JSON Viewer中内置的问题,但是JSON.NET似乎将整个json字符串作为Key而不是解析它。我知道我可以破解它并手动从密钥中解析出我需要的值,但这很脏,因为我宁愿这样做。

我使用JSON或方法来获取它有什么问题,或者json.net库/ asp.net中是否存在导致此行为的错误?知道为什么会这样吗?

修改

可能以某种方式将数据序列化两次,但我不确定为什么/如何。从我的调试器这里得到json的字符串化值:

Root = {
"{\"__RequestVerificationToken\":\"yqob-3bUW8C8sUrHWu_feRFOz2KPUKqugo1QoN2s8v9UhlMTwSonxoEdnh85TdM56Xj-aixZdgSQXs8D6ureAQTU83wVtvsoLBd2tDl0ZPyq_2sFefObQx0VHOExQjgh0\",\"ProjectInfo.Description\":\"Test Description\"}": ""
}

这是在客户端生成JSON的代码。它是一个jQuery扩展:

$.fn.serializeObject = function () {
    var o = {};
    var a = this.serializeArray();
    $.each(a, function () {
        if (o[this.name] !== undefined) {
            if (!o[this.name].push) {
                o[this.name] = [o[this.name]];
            }
            o[this.name].push(this.value || '');
        } 
        else {
            o[this.name] = this.value || '';
        }
    });
    return o;
};

然后在提交方法中调用它:

$('#description-editable form').submit(function (e) {
    e.preventDefault();
    var data = JSON.stringify($(this).serializeObject());

    //ajax method for PUT here...

});

1 个答案:

答案 0 :(得分:1)

这取决于你的AJAX选项是什么,但看起来你的对象在被发送之前被字符串化了两次。您应该可以删除stringify来电:

$('#description-editable form').submit(function (e) {
    e.preventDefault();
    var data = $(this).serializeObject();

    //ajax method for PUT here...

});