返回 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,但它包含我不想要的反斜杠“\”的主要内容,如果未能解决你的问题,请参考以下文章