在Newtonsoft中序列化Generic KeyValue项问题



我有这样的类结构:

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(),而不是标准方法。我能做什么?

在序列化时尝试使用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);

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
}

相关内容

  • 没有找到相关文章

最新更新