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

时间:2012-12-12 06:15:32

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

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

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

我还将此代码添加到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);

18 个答案:

答案 0 :(得分:27)

我有同样的问题,直到刚才。原来我是&#34;双序列化&#34; JSON字符串。我对$.getJson(控制器操作使用jQuery JsonResult AJAX调用。并且因为该操作构建了一个C#Generic List<t>我认为我必须使用JSON.net/NewtonSoft将C#Generic List<t>转换为JSON对象,然后使用以下命令返回JSON:

return Json(fake, JsonRequestBehavior.AllowGet);

毕竟我没有必要使用JsonConvert.SerializeObject(方法,显然这个return会为我们收集序列化。

希望它也可以帮助你或其他人。

答案 1 :(得分:21)

我发现这里的解决方案是

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

答案 2 :(得分:10)

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"`

答案 3 :(得分:10)

最有可能的是,斜杠是一个工件,因为您将它们从VisualStudio调试器中复制出来。调试器以可以粘贴到C / C#代码中的方式显示所有字符串。它们并非真正存在于传输的数据中。

BTW:这些斜杠是向后斜杠。正斜杠看起来像这样:/。

答案 4 :(得分:3)

我有同样的问题,响应中包含“当我使用

        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);

答案 5 :(得分:3)

为了看到“完整”的代码片段,这就是我用来实现解决方案的方法:

    [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 :(得分:2)

经过几个小时的尝试来解决这个问题,对这个问题的一个流行反应似乎对我来说是准确的。但是,不是我想象的方式。

我的代码非常简单:

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

我确信&#34;双重序列化&#34;不适用于我。毕竟,我只是将对象显式序列化为JSON一次。

我试过这个片段:

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

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

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

嗯... 但是,看哪!仔细观察我在Swagger UI中的原始响应,并在将其复制并粘贴到JSON美化器后 - 事实上我已经在某种程度上&#34;双重序列化&#34;。 使用以下代码产生正确的JSON响应

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

那是对的!只需直接发送可序列化对象,无需序列化为JSON!似乎响应自动将对象序列化为JSON。希望这有帮助!

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

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

答案 7 :(得分:2)

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

return Content(JsonConvert.SerializeObject(myData));

答案 8 :(得分:1)

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

答案 9 :(得分:1)

我找到了解决方案,它对我有用:

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

答案 10 :(得分:1)

这对我有用。上面的riseres用户回答了。

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

答案 11 :(得分:1)

在我的情况下,来自服务器的字符串包括反斜杠,例如:

{\"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网站指示了这样做的方法:返回Ok(JSON_string);

遵循Microsoft的指南,问题已解决

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

答案 12 :(得分:0)

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

                    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
                }

答案 13 :(得分:0)

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

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

我是从here

得到的

答案 14 :(得分:0)

就我而言,我在调试器中查看JSON字符串,发现其中添加了转义。当我将JSON打印到控制台时,它没有转义字符。

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

原始:https://stackoverflow.com/a/46836331/4654957

答案 15 :(得分:0)

使用下面的.netcore项目代码对我有用,同时将数据表转换为json

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 :(得分:0)

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

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

答案 17 :(得分:0)

<块引用>

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;