Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#JSON反序列化删除'+';_C#_Json.net - Fatal编程技术网

C#JSON反序列化删除'+';

C#JSON反序列化删除'+';,c#,json.net,C#,Json.net,我使用Newtonsoft.Json将Json对象反序列化为模型。我的对象中的一个字符串是: mQvhIBYwGVtLQYtoSgUsHBxcvRcRiOpb94zqwYPF8Cz1scPia1pR4BgGZ2ThPv+NhXGlLFK/ZbHy/b3YzjKwBw== 我发现在RequestFolioDetailModel之后RequestFolioDetailModel=JsonConvert.DeserializeObject(条件);在控制器中,User.SessionId的值将删除“

我使用Newtonsoft.Json将Json对象反序列化为模型。我的对象中的一个字符串是:

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
    ...
}