【问题标题】:JSON.NET Parsing Full Key-Value Pair as KeyJSON.NET 将完整的键值对解析为键
【发布时间】:2015-05-07 13:55:46
【问题描述】:

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

我将数据作为 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,其值为空值,如下面的屏幕截图所示:

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

我的 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...

});

【问题讨论】:

  • JSON 有没有可能被序列化了两次?这可以解释为什么 JSON.NET 认为整个字符串是单个值而不是对象
  • @AndrewWhitaker 这绝对是可能的。从调试器中的数据看我的编辑
  • 你能展示创建 JSON 的代码吗?
  • @AndrewWhitaker 你的意思是在客户端生成它的 JavaScript 吗?
  • 是的。我认为您不需要在这里致电JSON.stringify。没有它你可以试试吗?

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


【解决方案1】:

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

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

    //ajax method for PUT here...

});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2016-06-27
    • 1970-01-01
    相关资源
    最近更新 更多