我在问题之下编写了解决方案!!!
我已经阅读过类似的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序列化我的图表对象(带有实例类标题,yAxis,系列等),这导致以下输出:
{
"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-&gt;数据的值用引号括起来。因为highstock显然需要一个对象数组作为数据([[DateTime,value],[DateTime,value],...等]),除非我在数组周围删除这些引号,否则不会呈现图表。
当数组是&#34;纯粹&#34;整数没有引号(我猜),但由于我的点需要是DateTime / value,我需要一个对象数组。
因此问题:如何强制我的JSON序列化程序不将对象数组的值括在引号中?
也许这是微不足道和简单的,我期待远。如上所述,我已经阅读了很多关于类似问题的文章,但没有任何对我有用的东西。任何帮助高度赞赏!
解:
我的series-node中的数据数组是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和标记的答案),不带引号。
代码(参考:http://forums.asp.net/post/1463013.aspx ...但稍微修改一下)将c#DateTime转换为所需的毫秒时间戳:
public double MilliTimeStamp(DateTime d2)
{
DateTime d1 = new DateTime(1970, 1, 1);
TimeSpan ts = new TimeSpan(d2.Ticks - d1.Ticks);
return ts.TotalMilliseconds;
}
答案 0 :(得分:2)
我创建了一个定义如下的类:
public class Series
{
public string type { get; set; }
public string name { get; set; }
public List<object> data { get; set; }
}
然后使用以下代码填充它并将其转换为JSON。
Series series = new Series();
series.type = "foo";
series.name = "bar";
series.data = new List<object>();
for( int i = 0; i < 5; i++ )
{
series.data.Add( DateTime.Now );
series.data.Add( i );
}
var json = JsonConvert.SerializeObject( series );
生成的JSON是:
{ “类型”: “foo” 的, “姓名”: “棒”, “数据”:[ “2014-04-17T07:47:16.3620755-07:00”,0,“2014-0 4-17T07:47:16.3620755-07:00" ,1, “2014-04-17T07:47:16.3620755-07:00”,2“,2014年4月17日 T07:47:16.3620755-07:00" ,3 “2014-04-17T07:47:16.3620755-07:00”,4]}
P.S。将data
声明为object[]
也会生成上述JSON。
答案 1 :(得分:1)
来自@CraigW的回答。非常接近。为了使它更接近你所追求的,尝试将data
声明为对象集合的集合:
public class Series
{
public string type { get; set; }
public string name { get; set; }
public List<List<object>> data { get; set; }
}
测试代码以填充模型:
Series series = new Series();
series.type = "foo";
series.name = "bar";
series.data = new List<List<object>>();
for (int i = 0; i < 5; i++)
{
var data = new List<object>();
data.Add(DateTime.Now);
data.Add(i);
series.data.Add(data);
}
var json = JsonConvert.SerializeObject(series, Formatting.Indented);
测试结果:
{
"type": "foo",
"name": "bar",
"data": [
[
"2014-04-17T22:15:06.8812404+07:00",
0
],
[
"2014-04-17T22:15:06.8812404+07:00",
1
],
[
"2014-04-17T22:15:06.8812404+07:00",
2
],
[
"2014-04-17T22:15:06.8812404+07:00",
3
],
[
"2014-04-17T22:15:06.8812404+07:00",
4
]
]
}