C# 在Newtonsoft中序列化通用KeyValue项问题
我有这样的班级结构:C# 在Newtonsoft中序列化通用KeyValue项问题,c#,asp.net-mvc-4,json.net,C#,Asp.net Mvc 4,Json.net,我有这样的班级结构: public class GraphDataItem<TCategory, TValue> { public TCategory Category { get; set; } public TValue Value { get; set; } public GraphDataItem(TCategory category, TValue value) { Category = category;
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;
}
}
我想要默认的DateTime序列化行为,它将产生如下结果:
[{"Category":/Date(1245398693390)/,"Value":1},
{"Category":/Date(1245398693390)/,"Value":38},
{"Category":/Date(1245398693390)/,"Value":18}]
我怀疑库正在调用Category的
toString()
,而不是标准方法。我能做什么?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
}
序列化时,请尝试使用
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);
JsonSerializerSettings设置=新建JsonSerializerSettings();
settings.DateFormatHandling=DateFormatHandling.MicrosoftDateFormat;
settings.DateTimeZoneHandling=DateTimeZoneHandling.Utc;
List items=GetItems();
var json=JsonConvert.SerializeObject(项目、设置);
JSON.Net使用的默认日期序列化格式是Microsoft日期格式。这不再是事实。默认为ISO日期格式;从版本4.5发行版1开始就一直如此。参见发行说明。啊,这就解释了。所以在这种情况下,你的答案应该会很好。谢谢,这正是我需要的;很乐意帮忙。
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
}
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.DateFormatHandling = DateFormatHandling.MicrosoftDateFormat;
settings.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
List<GraphDataItem<DateTime, int>> items = GetItems();
var json = JsonConvert.SerializeObject(items, settings);