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);