从JSON序列化中转义c#类属性(删除引号)

时间:2014-04-17 12:42:44

标签: c# asp.net highcharts json.net highstock

我在问题之下编写了解决方案!!!


我已经阅读过类似的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;
        }

2 个答案:

答案 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
    ]
  ]
}