C# 为什么JsonResult返回经过修改的Json(用\“quot”而不是“quot”)?
我在WebApi控制器中编写了以下操作:C# 为什么JsonResult返回经过修改的Json(用\“quot”而不是“quot”)?,c#,asp.net-mvc,json,serialization,C#,Asp.net Mvc,Json,Serialization,我在WebApi控制器中编写了以下操作: public JsonResult GetData() { _client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); var item = new Item(); item.GenerateData(); var jsonMediaTypeF
public JsonResult GetData()
{
_client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var item = new Item();
item.GenerateData();
var jsonMediaTypeFormatter = new JsonMediaTypeFormatter
{
UseDataContractJsonSerializer = true
};
var jsonSerializer = new JsonSerializer();
var serializedData = jsonSerializer.Serialize(jsonMediaTypeFormatter, item);
var jsonResult = new JsonResult
{
ContentType = "application/json",
Data = serializedData,
JsonRequestBehavior = JsonRequestBehavior.AllowGet,
};
return jsonResult;
}
该行:
var serializedData=jsonSerializer.Serialize(jsonMediaTypeFormatter,item)
将数据序列化为Json,因此我有:
{"Class":{"Valid":{"From":"\/Date(1363302000000+0100)\/","To":"\/Date(43017433200000+0100)\/"},"Code":3,"Id":3,"Name":"Class3"},
等等。。(不是完整的Json)
但是JsonResult返回的Json不同:
{"ContentEncoding":null,"ContentType":"application\/json","Data":"{\"Class\":{\"Valid\":{\"From\":\"\\\/Date(1363302000000+0100)\\\/\",\"To\":\"\\\/Date(43017433200000+0100)\\\/\"},\"Code\":3,\"Id\":3,\"Name\":\"Class3\"},
注意文本中的\。
为什么会这样?怎么改?我想不出来
EDITJsonSerializer JsonSerializer是我的助手类,它使用DataContractJsonSerializer将数据序列化为Json。其代码如下:
public class JsonSerializer
{
public string Serialize<T>(MediaTypeFormatter formatter, T value)
{
// Create a dummy HTTP Content.
Stream stream = new MemoryStream();
var content = new StreamContent(stream);
// Serialize the object.
formatter.WriteToStreamAsync(typeof(T), value, stream, content, null).Wait();
// Read the serialized string.
stream.Position = 0;
return content.ReadAsStringAsync().Result;
}
}
公共类JsonSerializer
{
公共字符串序列化(MediaTypeFormatter格式化程序,T值)
{
//创建一个虚拟HTTP内容。
Stream=新的MemoryStream();
var内容=新的流内容(流);
//序列化对象。
WriteToStreamAsync(typeof(T),value,stream,content,null).Wait();
//读取序列化的字符串。
流位置=0;
返回content.ReadAsStringAsync().Result;
}
}
我想要的是它的执行结果——并且不被更改——返回给用户
JsonResult
已经将您放入数据中的任何内容序列化为JSON
在设置数据
之前,您的代码将手动序列化为JSON,这将导致输出包含一个双序列化对象(项
首先手动序列化为JSON字符串,然后使用JSON规则再次序列化该字符串——正是这第二个序列化正在转义您的引号)
虽然从技术上讲,我们不能排除双重序列化是故意进行的,但您应该做的很可能是
var jsonResult = new JsonResult
{
ContentType = "application/json",
Data = item,
JsonRequestBehavior = JsonRequestBehavior.AllowGet,
};
如果不想序列化两次,但需要手动序列化,请改用ContentResult
:
return new ContentResult
{
ContentType = "application/json",
Content = serializedData,
};
JsonResult
已经将放入数据中的任何内容序列化为JSON
在设置数据
之前,您的代码将手动序列化为JSON,这将导致输出包含一个双序列化对象(项
首先手动序列化为JSON字符串,然后使用JSON规则再次序列化该字符串——正是这第二个序列化正在转义您的引号)
虽然从技术上讲,我们不能排除双重序列化是故意进行的,但您应该做的很可能是
var jsonResult = new JsonResult
{
ContentType = "application/json",
Data = item,
JsonRequestBehavior = JsonRequestBehavior.AllowGet,
};
如果不想序列化两次,但需要手动序列化,请改用ContentResult
:
return new ContentResult
{
ContentType = "application/json",
Content = serializedData,
};
双引号被转义。这是预期和期望的行为-它使字符串(如保存JSON数据的字符串)不会提前关闭。双引号被转义。这是预期和期望的行为-它保留字符串(如保存JSON数据的字符串)您为什么不使用内置的Json()
方法为您构建结果对象呢
public JsonResult GetData()
{
_client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var item = new Item();
item.GenerateData();
return Json(item);
}
如果您需要详细控制序列化是如何完成的,您可以。该帖子还建议为您的控制器创建一个基类,该基类覆盖Json()
方法,但我宁愿在控制器上创建一个扩展方法
——一方面,这不会对控制器的基类提出任何要求,另一方面,如果需要,它也不会隐藏默认行为:
public static class ControllerExtensions
{
public static JsonResult DataContractJson(this Controller ctrl, object data) {
return new DataContractJsonResult { Data = data };
}
}
(与上面的问题相同)似乎完全完成了您正在做的事情—选择一个可以处理数据协定属性的JSON序列化程序。为什么不使用内置的JSON()
方法,为您构建结果对象呢
public JsonResult GetData()
{
_client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var item = new Item();
item.GenerateData();
return Json(item);
}
如果您需要详细控制序列化是如何完成的,您可以。该帖子还建议为您的控制器创建一个基类,该基类覆盖Json()
方法,但我宁愿在控制器上创建一个扩展方法
——一方面,这不会对控制器的基类提出任何要求,另一方面,如果需要,它也不会隐藏默认行为:
public static class ControllerExtensions
{
public static JsonResult DataContractJson(this Controller ctrl, object data) {
return new DataContractJsonResult { Data = data };
}
}
(与上面的问题相同)似乎完全完成了您正在做的事情-选择一个可以处理数据协定属性的JSON序列化程序。我忘了添加。我需要使用DataContractJsonSerializer序列化数据。然后如何使用它序列化?很好,谢谢,但我仍然对结果不太满意(看编辑后的问题)@lukasz.pek:什么是JsonSerializer
?我忘了添加。我需要用DataContractJsonSerializer序列化数据,然后如何用它序列化?很好,谢谢,但我仍然对结果不太满意(看编辑后的问题)@lukasz.pek:什么是JsonSerializer
?