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...
});
我正在为 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...
});