【问题标题】:Deserialize DateTime? Json反序列化日期时间? json
【发布时间】:2013-11-22 14:56:04
【问题描述】:

我有一个包含类类型元素的列表,其中包含一个属性

[DataMember]
public DateTime? DateOfBirth { get; set; }

我将整个列表序列化为一个文件,如下所示:

    JsonSerializer serializer = new JsonSerializer();
    serializer.Converters.Add(new JavaScriptDateTimeConverter());
    serializer.NullValueHandling = NullValueHandling.Ignore;

    using (StreamWriter sw = new StreamWriter(@"c:\json.txt"))
    using (JsonWriter writer = new JsonTextWriter(sw))
    {
        serializer.Serialize(writer, _myList);
    }

当我尝试像这样反序列化时:

    JsonSerializer serializer = new JsonSerializer();
    serializer.Converters.Add(new JavaScriptDateTimeConverter());
    string text = System.IO.File.ReadAllText(@"c:\json.txt");

    _myList = JsonConvert.DeserializeObject<List<UserInformation>>(text);

我收到以下错误:

在“命名空间”上将值设置为“出生日期”时出错。

  • 编辑-

Json 看起来像:"DateOfBirth":new Date(-1459735200000)(当 DateOfBirth == null 时我找不到它的样子)

我是一个使用 Json 的初学者,我很难理解它,有人可以向我解释一下是什么问题以及如何解决这个问题?

提前致谢

【问题讨论】:

  • JSON 是什么样的?
  • 您使用的是 wcf 还是 Web API?如果您手动进行序列化,我会推荐 newtonsoft json 序列化器,而不是使用 WCF 打包的序列化器。 (甚至 Microsoft 也使用 NewtonSoft 序列化程序用于 WebApi):从 nuget 控制台安装包 Newtonsoft.Json -- 如果您想了解更多信息,请回复评论,我会发布答案。
  • 它可能与您的 json 中不同的日期时间字符串有关。您可能需要使用像 newtonsoft json.net 这样的东西以获得更大的灵活性
  • 捕捉 JMarsch - 我的想法完全正确
  • @MichaelPerrenoud 我在编辑中添加了 Json。

标签: c# json datetime serialization


【解决方案1】:

如果您使用 newtonsoft 库,那么您可以向Deserializeyour json 添加一个不错的小通用方法:

public T Deserialize<T>(string json)
{
    try
    {
        var value =  Newtonsoft.Json.JsonConvert
            .DeserializeObject<T>(json);
        return value;
    }
    catch (Exception ex)
    {
        // examine the ex.Message here if required
    }
    return default(T);
}

这可能会让你更近一步

【讨论】:

  • 我只是添加 dll 作为参考,我的项目中没有整个库。
  • 我刚刚添加了库,但是它有点大,我在哪里添加呢?
  • 基本上,添加这个小方法并在您的客户端代码中,删除反序列化的行并添加对方法的调用,使用文件的内容作为参数,即_myList = Deserialize&lt;List&lt;UserInformation&gt;&gt;(text)
  • 我试过了,唯一的区别是现在它进入了 catch 并返回 null,因为我仍然不知道该做什么,因为错误消息是同样,我的包含所有数据的文本文件非常大,有超过 1 个 DateOfBirth。
【解决方案2】:

由于我没有得到对我有帮助的答案,我将发布我用来解决此问题的解决方案。我真的不想这样做,但我不得不将 DateTime 更改为 long,并保存 Ticks,当我需要日期时,我可以像这样转换

DateTime dt = new DateTime(long ticks);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    相关资源
    最近更新 更多