使用json.net将字符串转换为日期时间类型

3

我正在尝试对以下内容进行反序列化:

{"ts":"2012-04-22 04:14:50,669", "msg":"Hello"}

转化为

public class LogEntry
{
    public DateTime Ts { get; set; }
    public string Msg { get; set; }
}

使用
var logEntry = JsonConvert.DeserializeObject<LogEntry>(line);

但是出现了JsonSerializationException,错误信息为“{“将值“2012-04-22 04:14:28,478”转换为类型“System.DateTime”的错误。第1行,第31个位置。”我无法更改日志格式。
我认为我需要使用转换器自己解析日期字符串。但是,我找不到任何相关的JsonConverter示例。具体来说,在ReadJson方法中如何从reader中读取值。
是否有任何简单的示例可以参考?或者我这样做是错误的吗?

这个 Stack Apps 上的问题看起来可以满足你的需求:http://stackapps.com/questions/1175/how-to-convert-unix-timestamp-to-net-datetime/1176 - ilivewithian
谢谢。是的,我以前看过它,但由于 ReadJson 方法中的代码已被注释掉,所以我认为它不是一个非常好的例子。 - Niklas
向下滚动示例,有一个未注释的ReadJson方法版本。无论哪种方式,示例的基本原则都是正确的。 - ilivewithian
逗号是因为它是十进制分隔符。我更关心的是帮助Json.net解析某些内容的一般方法。 - Niklas
2个回答

5
您的DateTime字符串格式使用逗号作为小数分隔符(,478)。您可以尝试使用适当的Culture初始化JsonSerializerSettings对象(此处记录),然后使用DeserializeObject<T>(value, settings)此处记录)进行反序列化。这将使用您指定的文化来反序列化,而不是默认的InvariantCulture

看起来不错。然而,我的json.net版本(由于依赖关系原因我目前无法升级)在JsonSerializerSettings上没有Culture或Date*属性。 - Niklas
很不幸。:/ 在这种情况下,我想你只能走自定义转换器的路线了。这个stackoverflow条目有用吗? - raveturned

-1
我怀疑问题出在你获取的数值中使用了逗号作为小数点分隔符,这表明它是在使用逗号的语言环境下创建的(例如许多非英语欧洲语言)。你可以尝试更改你的语言环境以匹配所需格式,这样解析就会成功吗?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接