【发布时间】:2014-04-17 12:42:43
【问题描述】:
我在问题下方编辑了解决方案!!!
我已经阅读了大约 30 篇关于此的类似文章,但没有什么能引起人们的注意。
我的场景:为了在 ASP.NET 中为图表库(highcharts/highstock)提供数据,我手动为此类图表创建了基本类。这是因为所有包装器项目都适用于 highcharts,但不适用于 highstock。但是,highstock 需要这样的 HTML 脚本块(工作):
<script>
$('#container2').highcharts('StockChart',
{
"title": {
"text": "Graph_Title_string"
},
"yAxis": {
"title": {
"text": "YAxis_Title_string"
},
"height": 200,
"lineWidth": 2,
"top": 80
},
"series": [
{
"type": "line",
"name": "Testdata",
"data": [[Date.UTC(2014, 3, 8, 0, 0), 3], [Date.UTC(2014, 3, 9, 0, 0), 2], [Date.UTC(2014, 3, 10, 0, 0), 4], [Date.UTC(2014, 3, 11, 0, 0), 4], [Date.UTC(2014, 3, 12, 0, 0), 3], [Date.UTC(2014, 3, 13, 0, 0), 4], [Date.UTC(2014, 3, 14, 0, 0), 2], [Date.UTC(2014, 3, 15, 0, 0), 1], [Date.UTC(2014, 3, 16, 0, 0), 4], [Date.UTC(2014, 3, 17, 0, 0), 0]]
}]
});
我创建了 c# 类及其属性,例如:
public class Series
{
public string type { get; set; }
public string name { get; set; }
public object data { get; set; }
}
稍后我使用 JsonConvert.SerializeObject 来序列化我的图表对象(其中包含实例类 title、yAxis、series 等),从而产生以下输出:
{
"title": {
"text": "Graph_Title_string"
},
"yAxis": {
"title": {
"text": "YAxis_Title_string"
},
"height": 200,
"lineWidth": 2,
"top": 0
},
"series": [
{
"type": "line",
"name": "Testdata",
"data": "[[Date.UTC(2014, 3, 8, 0, 0), 3],[Date.UTC(2014, 3, 9, 0, 0), 2],[Date.UTC(2014, 3, 10, 0, 0), 0],[Date.UTC(2014, 3, 11, 0, 0), 4],[Date.UTC(2014, 3, 12, 0, 0), 4],[Date.UTC(2014, 3, 13, 0, 0), 2],[Date.UTC(2014, 3, 14, 0, 0), 1],[Date.UTC(2014, 3, 15, 0, 0), 1],[Date.UTC(2014, 3, 16, 0, 0), 0],[Date.UTC(2014, 3, 17, 0, 0), 3]]"
}
]
}
所以问题是:series->data 的值用引号括起来。由于 highstock 显然需要一个对象数组作为数据([[DateTime, value],[DateTime, value],...etc]),因此除非我删除数组周围的这些引号,否则不会呈现图表。
当数组是“纯”整数时,不会有引号(我猜),但由于我的点需要是 DateTime/value,所以我需要一个对象数组。
因此问题是:如何强制我的 JSON 序列化程序不将对象数组的值括在引号中?
也许这是微不足道和简单的,我期待的很远。如前所述,我已经阅读了很多关于类似问题的文章,但对我没有任何帮助。任何帮助都非常感谢!
解决方案:
我的系列节点中的数据数组是 int/double - DATE.UTC(2014, 3, 8, 0, 0) 不返回 DateTime 而是返回 NUMBER(参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/UTC)
因此,在我的后面类中定义一个双精度数组将产生所需的输出格式(如 craig 下面的伟大建议以及标记的答案所示),不带引号。
用于将 c# DateTime 转换为所需的毫秒时间戳的代码(参考:http://forums.asp.net/post/1463013.aspx ... 不过稍作修改):
public double MilliTimeStamp(DateTime d2)
{
DateTime d1 = new DateTime(1970, 1, 1);
TimeSpan ts = new TimeSpan(d2.Ticks - d1.Ticks);
return ts.TotalMilliseconds;
}
【问题讨论】:
-
data属性引用的对象的实际类型是什么? -
这有点乱:它是一个字符串。对此的解释:不知何故,HIGHSTOCK API 只能从生成的
-
您确定问题出在每个 DateTime 周围的引号吗?我的意思是,导致问题的不是 1 号:1."[[DateTime,0]]" 而不是 2.[["DateTime",0]]。如果你真的需要这种格式:[[DateTime,0]] 它不是一个有效的 JSON,你需要一个自定义序列化器来实现它
-
好点 - 我又仔细观察了我的阵列。显然 Date.now() 的 java 方法返回一个整数,所以 Date.UTC(Y-M-D) 返回一个整数,而不是 DateTime。因此我的数据对象必须是数字的。在这里看到一个小提琴:jsfiddle.net/s93Kn/1 日期转换器:fileformat.info/tip/java/date2millis.htm(使用未格式化的结果)这行得通,一旦我有一个双数组来序列化任何邪恶的引号就不会来破坏我的聚会。
标签: c# asp.net highcharts json.net highstock