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

Ove*_*lew 18 c# asp.net-mvc json json.net

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

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

public JsonResult GetTimelineJson()
{
    var result = new MyGraph([some data...]);

    return Json(JsonConvert.SerializeObject(result), JsonRequestBehavior.AllowGet);
}
Run Code Online (Sandbox Code Playgroud)

结果:

"{\r\n  \"id\": \"myGraph\",\r\n  \"title\": \"Graph title\",\r\n [...]
Run Code Online (Sandbox Code Playgroud)

任何将它包装成HtmlString等的尝试都会导致在线上传递一个空集(尽管调试点显示它正确地未转义).我已经检查过HTTP标头中是否正确设置了内容类型.

Rya*_*ght 32

该对象已由Json.NET序列化,当您将其传递给Json()时,它会被编码两次.如果你必须使用Json.NET而不是内置编码器,那么处理这个的理想方法是创建一个自定义ActionResult接受对象并在内部调用Json.net来序列化对象并将其作为application/json结果返回.

编辑

此代码用于上述解决方案.这是未经测试的,但应该有效.

public class JsonDotNetResult : ActionResult
{
    private object _obj { get; set; }
    public JsonDotNetResult(object obj)
    {
        _obj = obj;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        context.HttpContext.Response.AddHeader("content-type", "application/json");
        context.HttpContext.Response.Write(JsonConvert.SerializeObject(_obj));
    }
}
Run Code Online (Sandbox Code Playgroud)

并在您的控制器中只做:

return new JsonDotNetResult(result);
Run Code Online (Sandbox Code Playgroud)


Cag*_*lan 30

你也可以这样做

public ActionResult GetTimelineJson()
{
    var result = new MyGraph([some data...]);
    return Content(JsonConvert.SerializeObject(result), "application/json");
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这是最好的答案.一般来说,如果想要将未转义和未格式化的JObject返回给客户端,那么在JObject类中有`ToString(Formatting)`,它可以像这样使用:`JObject o = JObject.Parse("{foo :1000,bar:2000}"); return Content(o.ToString(Formatting.None),"application/json")`; (5认同)

kmc*_*049 5

你是 Jsoning 它两次,Json方法是 json 序列化你已经转换的字符串。如果您想使用 JsonConvert,则将其直接写入响应流。