如何在MVC项目中使用Json.Net返回未转义的Json?
到目前为止,我序列化了一个基本对象,并让Json.Net来序列化它:
public JsonResult GetTimelineJson()
{
var result = new MyGraph([some data...]);
return Json(JsonConvert.SerializeObject(result), JsonRequestBehavior.AllowGet);
}
结果:
"{\r\n \"id\": \"myGraph\",\r\n \"title\": \"Graph title\",\r\n [...]
任何试图将其包装为HtmlString等的尝试都会导致通过网络传递一个空集(尽管调试点显示它正确地未转义)。我已经检查了HTTP标头中的content-type设置是否正确。
发布于 2013-11-09 20:49:22
您也可以这样做
public ActionResult GetTimelineJson()
{
var result = new MyGraph([some data...]);
return Content(JsonConvert.SerializeObject(result), "application/json");
}
请注意,您应该将返回类型从JsonResult更改为ActionResult
发布于 2011-09-12 08:31:09
您对它进行了两次json调用,Json
方法正在序列化已经转换的字符串。如果您想使用JsonConvert,则将其直接写入响应流。
发布于 2014-11-19 22:38:14
我对我的新类做了一个小改动,使单元测试更容易:
public class JsonDotNetResult : ActionResult
{
public JsonDotNetResult(object data)
{
Data = data;
}
//Name the property Data and make the getter public
public object Data { get; private set; }
public override void ExecuteResult(ControllerContext context)
{
context.HttpContext.Response.AddHeader("content-type", "application/json");
context.HttpContext.Response.Write(JsonConvert.SerializeObject(Data));
}
}
}
这更类似于System.Web.Mvc中的JsonResult,并允许我使用泛型方法进行单元测试...
单元测试助手:
public static TReturn GetDataFromJsonResult<TJsonType, TReturn>(this ActionResult result) where TJsonType : ActionResult
{
var jsonResult = (TJsonType)result;
var data = jsonResult.GetType().GetProperty("Data").GetValue(jsonResult);
return (TReturn)data;
}
单元测试示例:
[TestMethod]
public void ControllerMethod_WhenMethodCalled_ThenSomeRecordsAreReturned()
{
// arrange
var records = new List<string> { "Record1", "Record2" };
var expectedRecordCount = records.Count();
myService.Setup(x => x.GetRecordsFromDatabase()).Returns(records);
// act
var result = myController.GetRecords(); //Assuming this controller method returns JsonDotNetResult
// assert
var jsonResult = result.GetDataFromJsonResult<JsonDotNetResult, IEnumerable<string>>();
Assert.AreEqual(expectedRecordCount, jsonResult.Count());
}
如果控制器返回正常的JsonResult,则可以更改此行:
var jsonResult = result.GetDataFromJsonResult<JsonResult, IEnumerable<string>>();
https://stackoverflow.com/questions/7382265
复制相似问题