在Newtonsoft中序列化Generic KeyValue项目问题

时间:2014-09-03 19:55:57

标签: 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;
        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()而不是标准方法。我该怎么办?

2 个答案:

答案 0 :(得分:3)

在序列化时尝试使用DateFormatHandlingDateTimeZoneHandling设置,例如:

JsonSerializerSettings settings = new JsonSerializerSettings();
settings.DateFormatHandling = DateFormatHandling.MicrosoftDateFormat;
settings.DateTimeZoneHandling = DateTimeZoneHandling.Utc;

List<GraphDataItem<DateTime, int>> items = GetItems();
var json = JsonConvert.SerializeObject(items, settings);

答案 1 :(得分:1)

JSON.Net使用的默认日期序列化格式是Microsoft日期格式。所以你应该得到你想要的日期。确保在序列化时,您没有使用IsoDateTimeConverter

关于不同日期序列化选项的此post可能会有所帮助。

此外,如果您使用的是最新的JSON.Net,则可以使用serialization tracing查看内部发生的情况。这可能会提供有用的线索,说明为什么会发生这种情况,或者如何强制它产生正确的输出。

如果其他一切都失败了,你可能不得不求助于你的自定义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
}