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

JSON.NET Parsing Full Key-Value Pair as Key

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

我将数据作为 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 值被认为是一个键,具有一个空值,如下面的屏幕截图所示:

我不确定为什么会这样,因为 JSON 似乎是有效的。 Fiddler 能够毫无问题地解析 JSON,因为它内置于 Json 查看器中,但 JSON.NET 似乎将整个 json 字符串作为键而不是解析它。我知道我可以破解它并手动从密钥中解析出我需要的值,但这很脏,因为我宁愿正确地完成它。

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

编辑:

数据可能以某种方式被序列化了两次,但我不确定 why/how。在我的调试器中,这里是 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...

});

这取决于您的 AJAX 选项,但看起来您的对象在发送之前被字符串化了两次。您应该能够删除 stringify 调用:

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

    //ajax method for PUT here...

});