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

20 浏览
0 Comments

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

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

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

public JsonResult GetTimelineJson()
{
    var result = new MyGraph([一些数据...]);
    return Json(JsonConvert.SerializeObject(result), JsonRequestBehavior.AllowGet);
}

结果:

"{\r\n \"id\": \"myGraph\",\r\n \"title\": \"Graph title\",\r\n [...]

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

0
0 Comments

在MVC中使用Json.Net返回未转义的JSON数据时出现了问题。问题的原因是代码中重复对数据进行了Json序列化操作,导致数据被转义了两次。解决方法是直接将使用JsonConvert进行的序列化操作写入响应流中。

代码中使用了Json方法对数据进行了一次Json序列化操作。然而,接下来又使用了JsonConvert对已经转换为字符串的数据进行了一次序列化操作。这导致了数据被转义了两次,返回的JSON数据无法正常解析。

要解决这个问题,我们可以直接将使用JsonConvert进行的序列化操作写入响应流中。这样可以避免重复的序列化操作,并保证返回的JSON数据是未转义的。

以下是修改后的代码示例:

public ActionResult GetJsonData()
{
    var data = new { Name = "John", Age = 30 };
    var jsonData = JsonConvert.SerializeObject(data);
    Response.ContentType = "application/json";
    Response.Write(jsonData);
    return null;
}

在修改后的代码中,我们首先使用JsonConvert对数据进行了一次序列化操作,并将结果保存在一个变量中。然后,我们设置响应的ContentType为"application/json",并使用Response.Write方法将序列化后的JSON数据直接写入响应流中。

这样做可以确保返回的JSON数据是未转义的,避免了重复的序列化操作。这个问题的解决方法非常简单,只需要对代码进行一点小的修改即可。通过这种方式,我们可以在MVC中正确地返回未转义的JSON数据。

0
0 Comments

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

问题的原因是,对象已经通过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));
    }
}

在你的控制器中,只需执行以下操作:

return new JsonDotNetResult(result);

这样就能返回未转义的Json数据了。

0
0 Comments

问题的出现原因是希望在MVC中返回未转义的Json数据,但在使用Json.Net进行序列化后,返回的Json数据会被自动转义。

解决方法是将返回类型从JsonResult改为ActionResult,并使用JsonConvert.SerializeObject()方法来手动序列化Json数据,然后使用Content()方法将序列化后的Json数据返回给客户端。

具体代码如下:

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

另外,如果想要返回未转义和未格式化的JObject对象给客户端,可以使用JObject类中的ToString(Formatting)方法。具体代码如下:

JObject o = JObject.Parse("{foo:1000, bar: 2000}");
return Content(o.ToString(Formatting.None), "application/json");

以上是解决在MVC中使用Json.Net返回未转义Json数据的方法。

0