返回 Json,但它包含我不想要的反斜杠“\”

Posted

技术标签:

【中文标题】返回 Json,但它包含我不想要的反斜杠“\\”【英文标题】:Return Json, but it includes backward slashes "\", which I don't want返回 Json,但它包含我不想要的反斜杠“\” 【发布时间】:2012-11-29 19:28:18 【问题描述】:

我使用 MVC4 web-api、c#,并希望返回 Json使用 Json.net。

问题在于它带有“反斜杠”。

我也将此代码添加到 Global.asax。 GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();

这是它返回的内容:

"\"cid\":1,\"model\":\"WT50JB\",\"detail\":\"sdf??\",\"unit\":2,\"time_in\":\"2012-12-11T19:00:00\",\"time_out\":\"2012-12-12T13:00:06.2774691+07:00\",\"time_used_dd\":0.0,\"time_used_hh\":0.0"

所以我想看到的是: "cid":1,"model":"WT50JB","detail":"sdf??","unit":2,"time_in":"2012-12-11T19:00:00","time_out" :"2012-12-12T13:08:50.5444555+07:00","time_used_dd":0.0,"time_used_hh":0.0

这里是 JsonConvertor

string json = JsonConvert.SerializeObject(myObj);

【问题讨论】:

【参考方案1】:

我也遇到了同样的问题,直到不久前。原来我是在“双重序列化”JSON 字符串。我使用 jQuery $.getJson( AJAX 调用 JsonResult 控制器操作。由于该操作构建了一个 C# Generic List<t>,我认为我必须使用 JSON.net/NewtonSoft 将 C# Generic List<t> 转换为 JSON 对象,然后再使用以下命令返回 JSON:

return Json(fake, JsonRequestBehavior.AllowGet);

毕竟我不用JsonConvert.SerializeObject(方法,显然这个return会为我们转换序列化。

希望它对您或其他人也有帮助。

【讨论】:

当然对我有帮助!对此,我真的非常感激。我想知道有多少开发人员落入同一个陷阱并试图找到解决办法。我到处都看到了这种不必要的转换。 我遇到了同样的问题。谢谢! 是的,但是以 Json 的形式返回不会在属性中获取我的 JsonProperty。只有 JsonConvert 序列化程序似乎可以做到这一点。例如,如果我有一个 ActualTarget 的属性,但希望它在 Json 中序列化为“Actual-Target”,这似乎不起作用。 这是我的问题,双重序列化..我是个白痴 同样的问题...修复它感觉很棒。谢谢你的帖子。【参考方案2】:

我在这里找到了解决方案

return new HttpResponseMessage() 

    Content = new StringContent(json, System.Text.Encoding.UTF8, "application/json")
;

【讨论】:

如何设置这是动作返回语句?【参考方案3】:
using Newtonsoft.Json.Linq;
string str = "Your String with Back Slashes";
str = JToken.Parse(str).ToString(); `// Now You will get the Normal String with "NO SLASHES"`

【讨论】:

为我工作。谢谢你。 :) 在我的情况下它在字符串中添加 \r\n 这一项适用于具有反斜杠的字符串,如下所示 \"data\":\"yes\"【参考方案4】:

最有可能的是,斜线是工件,因为您将它们从 VisualStudio 调试器中复制出来。调试器以可以粘贴到 C/C# 代码中的方式显示所有字符串。它们实际上并不在传输的数据中。

顺便说一句:这些斜线是向后斜线。正斜杠如下所示:/.

【讨论】:

没有forward斜线!只有普通的斜线/ 和它们的反斜线。 问题的原始修订版谈到了正斜杠。后来对其进行了编辑和更正。【参考方案5】:

为了看到“完整”的sn-p代码,这是我用来实现解决方案的:

    [AllowAnonymous]
    [HttpGet]
    public HttpResponseMessage GetAllMessages()
    

        try
        
            //Load Data Into List
            var mm = new MessageManager();
            List<Message> msgs = mm.GetAllMessages();

            //Convert List Into JSON
            var jsonmsgs = JsonConvert.SerializeObject(msgs);

            //Create a HTTP response - Set to OK
            var res = Request.CreateResponse(HttpStatusCode.OK);

            //Set the content of the response to be JSON Format
            res.Content = new StringContent(jsonmsgs, System.Text.Encoding.UTF8, "application/json");

            //Return the Response
            return res;
        
        catch (Exception exc)
        
            return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, exc);
        
    

【讨论】:

【参考方案6】:

主要是由于双重序列化而发生的。不久前我遇到了同样的问题,我不得不将一个集合序列化为 Json 字符串,即使在尝试了各种解决方法之后,我也无法解决它。因此,最后删除了所有的序列化代码并简单地返回了集合对象,并且默认情况下会处理序列化。所以尝试删除序列化代码并简单地返回返回类型。希望它可以帮助有类似问题的人。

【讨论】:

【参考方案7】:

经过数小时试图弄清楚这一点,对这个问题的一个流行回答似乎对我来说是准确的。但是,不是我想象的那样。

我的代码非常非常简单:

this.Request.CreateResponse(HttpStatusCode.Accepted, new javascriptSerializer().Serialize(obj));

我确信“双重序列化”的流行反应不适用于我。毕竟,我只是将我的对象显式序列化为 JSON 一次。

我试过这个 sn-p:

new StringContent(json, System.Text.Encoding.UTF8, "application/json")

这似乎甚至没有包含我的数据!相反,这是我收到的:


  "Headers": [
    
      "Key": "Content-Type",
      "Value": [
        "application/json; charset=utf-8"
      ]
    
  ]

嗯... 但是你瞧!仔细查看我在 Swagger UI 中的原始响应,然后将其复制并粘贴到 JSON 美化器中 - 事实上,我在某种程度上是“双重序列化”。 使用以下代码可以生成正确的 JSON 响应

 this.Request.CreateResponse(HttpStatusCode.Accepted, obj);

没错!直接发送可序列化对象即可,无需序列化为JSON!似乎响应自动将对象序列化为 JSON。希望这会有所帮助!

编辑: 如果您从一个 JSON 字符串开始,比如从数据库中说,您可以将字符串反序列化为一个对象并返回该对象 - 如下所示:

object obj = new JavaScriptSerializer().DeserializeObject(json);
this.Request.CreateResponse(HttpStatusCode.Accepted, obj);

【讨论】:

【参考方案8】:

我有同样的问题,当我使用时响应包含 \"

        JObject res = processRequst(req);
        String szResponse = res.ToString(Formatting.None);
        return Request.CreateResponse<string>(HttpStatusCode.OK, szResponse);

如果我将上面的代码替换为

,这些反斜杠 \" 将被删除
        JObject res = processRequst(req);
        return Request.CreateResponse<JObject>(HttpStatusCode.OK, res);

【讨论】:

【参考方案9】:

我发现答案的组合对我有用。正如上面提到的那样,我正在双重序列化。为了让序列化识别您的 JsonProperty 属性,您必须使用 JsonConvert 序列化程序。例如,我有一个名为 ActualtTarget 的属性,但需要将其序列化为 Actual-Target。序列化时Json结果将无法识别JsonProperty,所​​以我用JsonConvert序列化并返回如下字符串:

return Content(JsonConvert.SerializeObject(myData));

【讨论】:

【参考方案10】:

我找到了解决方案并且对我有用:

var json = JsonConvert.SerializeObject(sb.ToString(), Formatting.Indented);
response.Content = new StringContent(json, Encoding.UTF8 , "application/json");

【讨论】:

【参考方案11】:

这对我有用。以上由riseres 用户回答。

return new HttpResponseMessage() 

Content = new StringContent(json, System.Text.Encoding.UTF8, "application/json")
;

【讨论】:

【参考方案12】:

在我的情况下,来自服务器的字符串包括反溅:

\"cid\":1,\"model\":\"WT50JB\",\"detail\":\"sdf??\",\"unit\":2,\"time_in\":\"2012-12-11T19:00:00\",\"time_out\":\"2012-12-12T13:00:06.2774691+07:00\",\"time_used_dd\":0.0,\"time_used_hh\":0.0"

当 API 使用 POSTMAN 获取响应值时,仍会出现反溅。事实证明,您需要在服务器中格式化字符串,然后再推送回客户端(POSTMAN)。 MS网站指出了这样做的方法:return Ok(JSON_string);

按照微软的指导,问题就解决了

public ActionResult Get (int id, int id1)

     JSON_string = "your backsplash string"
     return Ok(JSON_string); //it will automatically format in JSON (like eliminate backsplash)


https://docs.microsoft.com/en-us/aspnet/core/web-api/advanced/formatting?view=aspnetcore-3.1

【讨论】:

【参考方案13】:

在这里我找到了解决方案:

                    response = response.replace("\"", "\\").replace("\\\\", "\"").replace("\\", "");
                JSONArray PackageData = new JSONArray(response);
                SelectSymbolList.clear();
                for (int i = 0; i < PackageData.length(); i++) 
                    JSONObject jsonData = PackageData.getJSONObject(i);
                    // get your array here
                

【讨论】:

【参考方案14】:

在我的例子中,我在调试器中查看 JSON 字符串,我发现它正在添加转义。当我将 JSON 打印到控制台时,它没有转义字符。

var jsonContent = JsonConvert.SerializeObject(obj); 
Console.WriteLine("HERE NO SLASHES"+ jsonContent); 

原文:https://***.com/a/46836331/4654957

【讨论】:

【参考方案15】:

在将数据表转换为 json 时,它使用以下代码为我工作,用于 .netcore 项目

var lst = dt.AsEnumerable()
.Select(r => r.Table.Columns.Cast<DataColumn>()
        .Select(c => new KeyValuePair<string, object>(c.ColumnName, r[c.Ordinal])
       ).ToDictionary(z => z.Key, z => z.Value)
).ToList();

【讨论】:

【参考方案16】:

在我的通用处理程序中,这有帮助。如果给定的字符串是 json 将在 try 中返回,否则将在 catch 中返回

private static dynamic TryParseJSON(string message)
    
        try
        
            var serializer = new JavaScriptSerializer();
            return serializer.Deserialize<dynamic>(message);
        
        catch
        
            return message;
        
    

【讨论】:

【参考方案17】:

Andrew Birks建议的答案对我有用

//Convert List Into JSON
var jsonString = JsonConvert.SerializeObject(dataTable);

//Create a HTTP response - Set to OK
var response = Request.CreateResponse(HttpStatusCode.OK);

//Set the content of the response to be JSON Format
response.Content = new StringContent(jsonString, System.Text.Encoding.UTF8, "application/json");

//Return the Response
return response;

【讨论】:

【参考方案18】:

我找到了解决方案并为我工作(Y)

var yourString = yourString.Replace("\\","");

我从here得到它

【讨论】:

以上是关于返回 Json,但它包含我不想要的反斜杠“\”的主要内容,如果未能解决你的问题,请参考以下文章

C#WebAPI返回json去掉双引号前面的反斜杠

JS去除字符串众的反斜杠

Gson Json 转换添加额外的反斜杠

如何在launch.json的Visual Studio Code中反转$ relativeFile中的反斜杠?

存储在本地存储中时 json 中不需要的反斜杠

Django URL中r的意思