45

我使用 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);
4

18 回答 18

35

我有同样的问题,直到几分钟前。原来我是在“双重序列化”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将为我们转换序列化。

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

于 2014-08-02T22:36:15.073 回答
28

我在这里找到了解决方案

return new HttpResponseMessage() 
{
    Content = new StringContent(json, System.Text.Encoding.UTF8, "application/json")
};
于 2012-12-13T18:28:02.767 回答
16
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"`
于 2015-11-26T08:18:05.350 回答
11

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

顺便说一句:这些斜杠是反斜杠。正斜杠看起来像这样:/.

于 2012-12-12T06:49:01.207 回答
4

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

    [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);
        }
    }
于 2017-03-08T11:36:14.843 回答
4

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

于 2017-06-13T13:07:46.920 回答
4

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

我的代码非常非常简单:

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

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

我试过这个片段:

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);
于 2017-10-24T14:03:19.627 回答
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);
于 2017-10-29T11:31:01.137 回答
2

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

return Content(JsonConvert.SerializeObject(myData));
于 2017-11-29T15:41:18.347 回答
1

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

var json = JsonConvert.SerializeObject(sb.ToString(), Formatting.Indented);
response.Content = new StringContent(json, Encoding.UTF8 , "application/json");
于 2017-02-21T10:30:51.690 回答
1

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

return new HttpResponseMessage() 
{
Content = new StringContent(json, System.Text.Encoding.UTF8, "application/json")
};
于 2020-10-06T06:12:12.383 回答
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网站指出了这样做的方法: 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

于 2020-10-21T08:05:54.313 回答
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
                }
于 2016-10-16T07:19:37.060 回答
0

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

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

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

于 2019-03-13T00:38:38.723 回答
0

在将数据表转换为 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();
于 2019-12-04T06:24:35.030 回答
0

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

private static dynamic TryParseJSON(string message)
    {
        try
        {
            var serializer = new JavaScriptSerializer();
            return serializer.Deserialize<dynamic>(message);
        }
        catch
        {
            return message;
        }
    }
于 2021-01-21T07:38:14.657 回答
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;
于 2021-05-02T18:21:26.743 回答
-3

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

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

我从这里得到的

于 2016-08-18T09:24:45.827 回答