C#JSON反序列化删除'+';
我使用Newtonsoft.Json将Json对象反序列化为模型。我的对象中的一个字符串是:C#JSON反序列化删除'+';,c#,json.net,C#,Json.net,我使用Newtonsoft.Json将Json对象反序列化为模型。我的对象中的一个字符串是: mQvhIBYwGVtLQYtoSgUsHBxcvRcRiOpb94zqwYPF8Cz1scPia1pR4BgGZ2ThPv+NhXGlLFK/ZbHy/b3YzjKwBw== 我发现在RequestFolioDetailModel之后RequestFolioDetailModel=JsonConvert.DeserializeObject(条件);在控制器中,User.SessionId的值将删除“
mQvhIBYwGVtLQYtoSgUsHBxcvRcRiOpb94zqwYPF8Cz1scPia1pR4BgGZ2ThPv+NhXGlLFK/ZbHy/b3YzjKwBw==
我发现在RequestFolioDetailModel之后RequestFolioDetailModel=JsonConvert.DeserializeObject(条件);在控制器中,User.SessionId的值将删除“+”并用空格而不是“+”保存该值
这是一个MVC应用程序。我通过一个条件对控制器进行Ajax调用,然后将其序列化为一个对象。请参见下面的代码片段:
密码
Javascript函数:
function GetNotesForCustomer() {
var data = {
FolioId: gModel.SearchPageModel.Body.VfolFolioId,
User: {
SessionId: 'mQvhIBYwGVtLQYtoSgUsHBxcvRcRiOpb94zqwYPF8Cz1scPia1pR4BgGZ2ThPv+NhXGlLFK/ZbHy/b3YzjKwBw=='
},
Note: {
Voided: '0'
}
};
$.ajax({
url: gBaseUrl + 'Home/SearchCustomerNotes',
type: 'post',
cache: false,
async: true,
data: "criteria=" + JSON.stringify(data),
beforeSend: function () {
//Do Something
}, complete: function () {
//Do Something
},
error: function (result) {
//Do Something
},
success: function (result) {
//Do Something
}
});
}
控制器:
[Route("Home/SearchCustomerNotes/{criteria?}")]
public ActionResult SearchCustomerNotes(string criteria)
{
ActionResult actionResult;
RequestFolioDetailModel requestFolioDetailModel = JsonConvert.DeserializeObject<RequestFolioDetailModel>(criteria);
// do something with request Folio Detail Model
return actionResult;
}
当我需要
+
保存时,如何阻止它这样做?问题是,您将JSON作为应用程序/x-www-form-urlencoded
内容(jQuery.ajax的默认内容类型)从客户端传递到服务器,但您不是URL编码它
应用程序/x-www-form-urlencoded
内容类型要求请求主体包含由&
字符分隔的URL编码键值对,就像在URL查询字符串中一样。当MVC服务器看到此内容类型时,它会对正文中的每一对应用URL解码操作,如果数据编码不正确,这将导致+
字符变为空格
当然,快速修复方法是在字符串化之后在客户端对JSON字符串进行编码:
$.ajax({
url: gBaseUrl + 'Home/SearchCustomerNotes',
type: 'post',
cache: false,
async: true,
data: "criteria=" + encodeURIComponent(JSON.stringify(data)),
...
});
但是,由于您的数据实际上是JSON,因此更好的解决方案是将其作为application/JSON
内容发送,并利用MVC框架提供的内置反序列化功能。为此,您需要对客户端和服务器上的代码进行一些调整。在客户端,向ajax
调用添加contentType
说明符,指定数据为application/json
。然后,从数据字符串中删除criteria=
部分。您不需要使用此内容类型进行任何URL编码。以下是客户端代码的外观:
$.ajax({
url: gBaseUrl + 'Home/SearchCustomerNotes',
type: 'post',
cache: false,
async: true,
contentType: "application/json",
data: JSON.stringify(data),
...
});
在服务器端,更改方法以直接接受RequestFolioDetailModel
对象。您可以从方法体中删除反序列化对象
调用,因为MVC框架将负责为您反序列化对象。当然,您需要调整路由
属性以删除标准
部分。您可能还希望在运行时向其添加HttpPost
[HttpPost, Route("Home/SearchCustomerNotes")]
public ActionResult SearchCustomerNotes(RequestFolioDetailModel requestFolioDetailModel)
{
// do something with request Folio Detail Model
...
}
JSON不会这样做。您可能看到URL解码。什么是
对象
?那代码无法编译?一个最小的、完整的、可验证的例子可以证明JsonConvert并没有按照你说的做。请编辑您的问题,以提供您的索赔的一些证据。。。
[HttpPost, Route("Home/SearchCustomerNotes")]
public ActionResult SearchCustomerNotes(RequestFolioDetailModel requestFolioDetailModel)
{
// do something with request Folio Detail Model
...
}