我正在尝试使用Newtonsoft.JSON将DataTable转换为JSON,但发现输出不是ExtJS网格和图表所期望的。
我的代码是
string output = JsonConvert.SerializeObject(dt, Formatting.Indented,
new JsonSerializerSettings
{
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
});
这会将Json字符串作为
返回"[{\"DAYDATE\":\"2012-05-22T00:15:00\",\"SERIES1\":3.65}]"
如果我删除'\'并开始和结束双引号,它可以与ExtJS一起使用。
我也尝试将日期格式更改为更多JSON'y
string javascriptJson = JsonConvert.SerializeObject(entry, new JavaScriptDateTimeConverter());
结果
"[{\"DAYDATE\":new Date(1337642100000),\"SERIES1\":3.65}]"
仍然没有运气
答案 0 :(得分:2)
看起来您的JSON正在进行双重序列化。虽然你没有显示完整的控制器代码,但我猜你正在做这样的事情:
public ActionResult GetDataTable()
{
// (... code to build data table omitted for brevity ...)
// Serialize data table using Json.Net to avoid circular reference error
string output = JsonConvert.SerializeObject(dt,
new JsonSerializerSettings
{
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
Formatting = Formatting.Indented
});
return Json(output);
}
Json()
方法也会调用序列化。通常,在MVC控制器中,您只需使用Json()
方法序列化返回对象,而不是单独使用Json.Net。我可以看到你在这里使用Json.Net试图解决当你尝试序列化数据表时由于循环引用而发生的异常。如果要手动序列化,则需要以不会第二次序列化的方式返回数据。您可以使用Content()
方法执行此操作。试试这样:
public ActionResult GetDataTable()
{
// Build data table
DataTable dt = new DataTable();
dt.Columns.Add("DAYDATE", typeof(DateTime));
dt.Columns.Add("SERIES1", typeof(double));
dt.Rows.Add(new DateTime(2012, 5, 22, 0, 15, 0), 3.65);
// Serialize data table using Json.Net to avoid circular reference error
string output = JsonConvert.SerializeObject(dt,
new JsonSerializerSettings
{
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
Formatting = Formatting.Indented
});
// Output is already serialized; return it as is (with the appropriate media type)
return Content(output, "application/json");
}
在我的测试中,上面会产生以下输出,我认为你正在寻找:
[ { "DAYDATE": "2012-05-22T00:15:00", "SERIES1": 3.65 } ]