【问题标题】:Escape c# class property from JSON serialization (to remove quotes)从 JSON 序列化中转义 c# 类属性(以删除引号)
【发布时间】: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


【解决方案1】:

我创建了一个定义如下的类:

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 是:

{"type":"foo","name":"bar","data":["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-04-17 T07:47:16.3620755-07:00",3,"2014-04-17T07:47:16.3620755-07:00",4]}

附:将data 声明为object[] 也生成了上述JSON。

【讨论】:

  • 可能会,但我的数据数组/列表不能是 DateTime 类型,因为我需要输入两种类型作为数据点(DateTime、int/double)。所以它必须是公共对象数据(或公共对象[]数据,没有区别)
  • 好的,我在最初的问题中没有明白这一点。我用一些代码和我自己尝试得到的结果更新了答案。
  • 可能比我最初的问题要清楚得多,因为它非常直截了当。您可以看到困扰我的问题:在 JSON 输出的 DateTime 部分周围加上引号会导致 HIGHSTOCK 库失败。我进一步尝试: Date.parse("2014-04-17T07:47:16.3620755-07:00") 在生成的
【解决方案2】:

@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
    ]
  ]
}

【讨论】:

  • 我很难真正理解他的根本问题,但我认为 DateTime 类型周围有引号是当前的问题。
  • 虽然这会产生我需要的结构,但最初的问题仍然存在:JSON 结果中 DateTime 对象周围的引号是我的问题。序列化时有什么方法可以删除这些?正如上面评论中所说,HIGHSTOCK api 似乎需要 EXACTLY Date.UTC(2014, 3, 8, 0, 0) - 不带引号。到目前为止,谢谢,这已经很有帮助了。
猜你喜欢
  • 2015-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 2017-05-08
  • 1970-01-01
相关资源
最近更新 更多