【问题标题】:Parsing Dates using JSON.NET使用 JSON.NET 解析日期
【发布时间】:2013-07-16 10:18:44
【问题描述】:

我正在使用 JSON.NET 的 LINQ to JSON 来解析数据,其中包括日期。我的 JSON 示例如下所示:

{"2013" : [
    { "date":"2/5/2013 11:13 AM","id":23 }],
"2012" : [
    { "date":"28/9/2012 5:29 PM","id":24 }]
}

日期格式为 d/m/yyyy h:mm。我尝试先使用 DateTime.Parse 解析它:

var postTitles = jobject.Children().SelectMany(x => x.First).
    Select(p =>
    new Report
        {
            Date = DateTime.Parse((string)p["date"]),
            Height = (int)p["height"]
        });

但是,它会在第二个日期引发 FormatException,所以我尝试使用 DateTime.ParseExact:

var postTitles = jobject.Children().SelectMany(x => x.First).
    Select(p =>
    new Report
        {
            Date = DateTime.ParseExact(p["date"].ToString(), "dd/mm/yyyy hh:mm", new
                CultureInfo("en-US")),
            Height = (int)p["height"]
        });

这一次,我在第一次约会时收到了 FormatException。有没有关于如何解析这个日期的替代方法?我尝试使用扩展方法,因为我习惯于使用 XML,但我的扩展方法似乎无法识别。

【问题讨论】:

    标签: c# json windows-phone json.net


    【解决方案1】:

    ParseExact 的格式字符串非常损坏。基本上,您确实需要注意实际数据的格式,并查看MSDN documentation for custom date/time strings。您不能只是放入任何旧模式并期望它起作用:它必须与您的数据相匹配。

    所以你可能想要一个格式字符串“d/M/yyyy h:mm tt”。我还建议使用不变的文化:

    Date = DateTime.ParseExact(p["date"].ToString(), "d/M/yyyy h:mm tt",
                               CultureInfo.InvariantCulture);
    

    (不变文化与美国文化基本相同,但重要的是它表明这是针对机器生成的数据,而不是真正以美国为中心的数据。)

    在 JSON.NET 中可能有更好的方法来做到这一点,但这至少应该是一个起点。

    【讨论】:

    • 能否请教我关于格式化字符串的问题?我很困惑,因为 MSDN 文档中的示例用法是针对 ToString 的。
    • @CCCC:不知道你的困惑在哪里,很难给你进一步的启示。
    • 据我了解,格式说明符提取日期的特定部分,如月、日和年,这需要格式正确的日期。我正在尝试做的事情是将 JSON 文件中的数据转换为格式正确的日期。
    • @CCCC:格式说明符基本上描述了数据的格式。我只是注意到早期的编辑删除了示例格式-我已经恢复了该部分,但实际上您应该仔细查看文档,并查看您提供的格式与您的数据实际采用的格式.. . 它们非常不同。
    • 很抱歉造成混淆,我在尝试处理其他数据以测试我的格式是否有问题时粘贴了错误的 sn-p。更正它是我最初使用的。
    猜你喜欢
    • 2018-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    • 2014-03-05
    • 2014-11-19
    • 1970-01-01
    相关资源
    最近更新 更多