我正在尝试使用Json.NET序列化一些Noda Time值并遇到麻烦。序列化很简单:
LocalDateTime dt = ... // Assigned elsewhere
LocalDateTimePattern isoDateTimePattern = LocalDateTimePattern.GeneralIsoPattern;
JObject root = new JObject();
root.Add("time", isoDateTimePattern.Format(dt));
// Serialize other elements
using (var sw = new StreamWriter(stream)) {
serializer.Serialize(sw, root);
}
但是反序列化是有问题的。 Json.NET似乎从上面识别出ISO格式的日期和时间 并自动将其转换为DateTime对象,这不是我想要的。
using (var sr = new StreamReader(stream)) {
using (var jr = new JsonTextReader(sr)) {
var root = serializer.Deserialize<JObject>(jr);
// Deserialize other elements
var time = root.GetValue("time"); // time.Type is JTokenType.Date
string timeStr = time.Value<string>(); // Is "01/10/2014 10:37:32"
// Kaboom. String is not in the right format (see above comment)
var parsedTime = isoDateTimePattern.Parse(time.Value<string>());
}
}
由于timeStr
以美国格式的日期和时间出现,我猜是time.Value<string>()
只需在Json.NET已解析的某个内部ToString
对象上调用DateTime
。
我可以做类似
var cdt = time.Value<DateTime>();
LocalDateTime ldt = new LocalDateTime(cdt.Year, cdt.Month, cdt.Day, cdt.Hour, cdt.Minute);
但这令人费解,意味着Json.NET正在执行不必要的转换。
有没有办法只获取JSON值的原始字符串值?
答案 0 :(得分:16)
NuGet上有一个NodaTime.Serialization.JsonNet package,似乎完全针对这种情况。以下是设置方法:
在解决方案中下载并安装软件包后,在代码中添加以下using
语句:
using NodaTime.Serialization.JsonNet;
像这样设置序列化程序:
JsonSerializer serializer = new JsonSerializer();
serializer.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);
然后,当您反序列化时,您可以使用LocalDateTime
从JObject
获得ToObject<LocalDateTime>(serializer)
,如下所示:
using (var sr = new StreamReader(stream))
{
using (var jr = new JsonTextReader(sr))
{
var root = serializer.Deserialize<JObject>(jr);
// Deserialize other elements
var time = root.GetValue("time");
var parsedTime = time.ToObject<LocalDateTime>(serializer);
}
}