我有这样的类结构:
public class GraphDataItem<TCategory, TValue>
{
public TCategory Category { get; set; }
public TValue Value { get; set; }
public GraphDataItem(TCategory category, TValue value)
{
Category = category;
Value = value;
}
}
我有一个这些项目的集合,我使用这样的东西序列化:
List<GraphDataItem<DateTime, int>> items = GetItems();
var json = JsonConvert.SerializeObject(items);
我得到的json输出如下:
[{"Category":"2014-04-30T00:00:00","Value":1},
{"Category":"2014-05-01T00:00:00","Value":38},
{"Category":"2014-05-02T00:00:00","Value":18}]
我想要默认的DateTime序列化行为,它将产生类似于:
[{"Category":/Date(1245398693390)/,"Value":1},
{"Category":/Date(1245398693390)/,"Value":38},
{"Category":/Date(1245398693390)/,"Value":18}]
我怀疑库调用的是Category的toString()
,而不是标准方法。我能做什么?
在序列化时尝试使用DateFormatHandling
和DateTimeZoneHandling
设置,例如:
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.DateFormatHandling = DateFormatHandling.MicrosoftDateFormat;
settings.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
List<GraphDataItem<DateTime, int>> items = GetItems();
var json = JsonConvert.SerializeObject(items, settings);
JSON.Net使用的默认日期序列化格式是Microsoft日期格式。所以你应该随心所欲地约会。确保在序列化时没有使用IsoDateTimeConverter
。
这篇关于不同日期序列化选项的文章可能会有所帮助。
此外,如果您使用的是最新的JSON.Net,则可以使用序列化跟踪来查看内部发生了什么。这可能会提供有用的线索,说明为什么会发生这种情况,或者如何迫使它产生正确的输出。
如果其他一切都失败了,你可能不得不求助于你的自定义JsonConverter:
public class CustomConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
...
if(value is DateTime) {
var d = value as DateTime;
serializer.Serialize(writer, d);
}
else {
serializer.Serialize(writer, value);
}
...
}
// other overrides
}