我使用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);
答案 0 :(得分:27)
我有同样的问题,直到刚才。原来我是"双序列化" 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)
答案 14 :(得分:0)
就我而言,我在调试器中查看JSON字符串,发现其中添加了转义。当我将JSON打印到控制台时,它没有转义字符。
var jsonContent = JsonConvert.SerializeObject(obj);
Console.WriteLine("HERE NO SLASHES"+ jsonContent);
答案 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;