【问题标题】: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);

【问题讨论】:

    标签: c# json asp.net-mvc-4 asp.net-web-api


    【解决方案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://stackoverflow.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得到它

                              【讨论】:

                                猜你喜欢
                                • 2014-12-25
                                • 2022-07-07
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 2017-03-28
                                • 2021-09-13
                                • 1970-01-01
                                相关资源
                                最近更新 更多