【发布时间】:2014-08-13 05:48:32
【问题描述】:
我正在尝试通过来自 ASP.Net 的 javascript 调用来填充 Highcharts 图表,我正在使用 JSON.Net 来序列化图表的数据。但是,我无法让从我的数据源创建的 JSON 与 Highcharts 似乎需要的格式相匹配。要查看问题,您只需检查 X 轴(类别),例如...
[{\"category\":\"August 15 and 16, 2014\"},{\"category\":\"March 21st, 2014\"},{\"category\":\"January 17 and 18, 2014\"},{\"category\":\"August 16 and 17, 2013\"},{\"category\":\"March 22nd, 2013\"},{\"category\":\"January 18 and 19, 2013\"},{\"category\":\"August 17 and 18, 2012\"},{\"category\":\"March 16th, 2012\"},{\"category\":\"January 20 and 21, 2012\"},{\"category\":\"August 19 and 20, 2011\"},{\"category\":\"January 21 and 22, 2011\"}]
应该是这样的……
['August 15 and 16, 2014', 'March 21st, 2014', 'January 17 and 18, 2014', 'August 16 and 17, 2013', 'March 22nd, 2013', 'January 18 and 19, 2013', 'August 17 and 18, 2012', 'March 16th, 2012', 'January 20 and 21, 2012', 'August 19 and 20, 2011', 'January 21 and 22, 2011']
所以基本上我的序列化是创建一个对象列表,我需要的只是一个值数组。为了解决这个问题,我需要生成一个值数组,或者让 Highcharts 构造函数读取对象。
ASP.Net 代码隐藏...
var tblNormal = Reporting.GetHistoricalTicketSalesReport();
var queryX = from row in tblNormal.AsEnumerable()
select new
{
category = row.ShowDateDescription
};
JObject o = JObject.FromObject(new
{
categories = queryX
});
string strXJSON = o.ToString();
// value is: "{\"categories\":[{\"category\":\"August 15 and 16, 2014\"},{\"category\":\"March 21 and 21, 2014\"},{\"category\":\"January 17 and 18, 2014\"},{\"category\":\"August 16 and 17, 2013\"},{\"category\":\"March 22 and 22, 2013\"},{\"category\":\"January 18 and 19, 2013\"},{\"category\":\"August 17 and 18, 2012\"},{\"category\":\"March 16 and 16, 2012\"},{\"category\":\"January 20 and 21, 2012\"},{\"category\":\"August 19 and 20, 2011\"},{\"category\":\"January 21 and 22, 2011\"}]}"
var queryY = from row in tblNormal.AsEnumerable()
select new HighChartsPoint
{
y = row.TicketsSold
};
o = JObject.FromObject(new
{
series = queryY
});
string strYJSON = o.ToString();
//This removes the wrapper around the inner JSON data
strXJSON = F.AllAfter(strXJSON, ":").TrimEnd('}');
//value is: "[{\"category\":\"August 15 and 16, 2014\"},{\"category\":\"March 21 and 21, 2014\"},{\"category\":\"January 17 and 18, 2014\"},{\"category\":\"August 16 and 17, 2013\"},{\"category\":\"March 22 and 22, 2013\"},{\"category\":\"January 18 and 19, 2013\"},{\"category\":\"August 17 and 18, 2012\"},{\"category\":\"March 16 and 16, 2012\"},{\"category\":\"January 20 and 21, 2012\"},{\"category\":\"August 19 and 20, 2011\"},{\"category\":\"January 21 and 22, 2011\"}]"
strYJSON = F.AllAfter(strYJSON, ":").TrimEnd('}');
//Call the function on the client browser
ExecuteJavascript("InitShowChart(" + strXJSON + ", " + strYJSON + ");");
【问题讨论】:
-
听起来您不应该使用 JSON 作为输入。你为什么不直接重写 ToString() 来返回你想要的,或者写一个方法来为你做呢?
-
因为我试图在不编写自己的序列化库的情况下解决问题,不是因为我很懒(这会节省我的时间),而是因为 JSON 规范将来可能会发生变化,我'希望我所有的 JSON 都由一个能够自动跟上时代的库生成。
-
我看到你的 json 格式不正确,因为不包含任何值的 y 参数。
标签: c# asp.net json highcharts json.net