首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Json.Net在MVC中返回未转义的Json

使用Json.Net在MVC中返回未转义的Json
EN

Stack Overflow用户
提问于 2011-09-12 08:24:53
回答 3查看 17.6K关注 0票数 19

如何在MVC项目中使用Json.Net返回未转义的Json?

到目前为止,我序列化了一个基本对象,并让Json.Net来序列化它:

代码语言:javascript
复制
public JsonResult GetTimelineJson()
{
    var result = new MyGraph([some data...]);

    return Json(JsonConvert.SerializeObject(result), JsonRequestBehavior.AllowGet);
}

结果:

代码语言:javascript
复制
"{\r\n  \"id\": \"myGraph\",\r\n  \"title\": \"Graph title\",\r\n [...]

任何试图将其包装为HtmlString等的尝试都会导致通过网络传递一个空集(尽管调试点显示它正确地未转义)。我已经检查了HTTP标头中的content-type设置是否正确。

EN

回答 3

Stack Overflow用户

发布于 2013-11-09 20:49:22

您也可以这样做

代码语言:javascript
复制
public ActionResult GetTimelineJson()
{
    var result = new MyGraph([some data...]);
    return Content(JsonConvert.SerializeObject(result), "application/json");
}

请注意,您应该将返回类型从JsonResult更改为ActionResult

票数 33
EN

Stack Overflow用户

发布于 2011-09-12 08:31:09

您对它进行了两次json调用,Json方法正在序列化已经转换的字符串。如果您想使用JsonConvert,则将其直接写入响应流。

票数 5
EN

Stack Overflow用户

发布于 2014-11-19 22:38:14

我对我的新类做了一个小改动,使单元测试更容易:

代码语言:javascript
复制
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,并允许我使用泛型方法进行单元测试...

单元测试助手:

代码语言:javascript
复制
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;
}

单元测试示例:

代码语言:javascript
复制
[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,则可以更改此行:

代码语言:javascript
复制
    var jsonResult = result.GetDataFromJsonResult<JsonResult, IEnumerable<string>>();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7382265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档