JSON.NET:获取特定的 JSON 日期值



在我的 VB.NET 项目中,使用 JSON.NET,我从Web API中获得了一个JSON,该JSON具有表示yyyy-MM-ddTHH:mm:ss格式日期的值,我想简单地获取该值。

以下是JSON的外观:

{
    "REQ_DATE": "2016-01-17T12:27:57",
    "REQ_TYPE": "Vacation",
    "HOURS": 500.0,
    "LEAVE_TIME": "8:00 AM",
    "LEAVE_DATE": "2016-01-23T00:00:00",
    "DUE_TIME": "8:00 AM",
    "DUE_DATE": "2016-01-24T00:00:00",
}

所以我应该序列化它并用值做我想做的事情,对吧?但是,当我将该键值放入变量中时,日期格式会自动更改!

Dim temp As String = myJsonResult("REQ_DATE")
' temp = "1/17/2016 12:27:57 PM"

我需要从检索到的 JSON 中获得该日期。我看到了解决这个问题的两种方法:手动将其转换为yyyy-MM-ddTHH:mm:ss,或使用正则表达式直接获取键值对 - 这两种方法我都没有成功。

我尝试将其转换为日期时间:

Dim tempDateTime As DateTime = DateTime.ParseExact(myJsonResult("REQ_DATE").ToString,"yyyy-MM-dd hh:mm:ss", CultureInfo.InvariantCulture)
' Error: String is not Recognized as valid DateTime
Dim myDesiredResult As String = tempDateTime.ToString("yyyy-MM-ddTHH:mm:ss")

我尝试使用正则表达式:

Dim regex As Regex = New Regex("""REQ_DATE"": ""([dw]*)""")
Dim match As Match = regex.Match(myJsonAsString)
If match.Success Then
   Dim myDesiredResult As String = match.Groups(1).Value
End If
' match is empty... 

非常感谢任何和所有的帮助。

我假设myJsonResult是您已将 JSON 加载到其中的JObject

您的困难在于 Json.NET 在读取时自动将字符串识别为日期,并将它们转换为DateTime结构。 然后,当您稍后对值令牌执行ToString()时,它将以 c# 的"固定区域性"格式返回,而不是原始格式,在本例中为 ISO 8601。 如果您不希望此行为,可以使用 JsonSerializerSettings.DateParseHandling = DateParseHandling.None 解析 JSON:

        Dim jsonString = "{'REQ_DATE':'2016-01-17T12:27:57','REQ_TYPE':'Vacation','HOURS':500.0,'LEAVE_TIME':'8:00 AM','LEAVE_DATE':'2016-01-23T00:00:00','DUE_TIME':'8:00 AM','DUE_DATE':'2016-01-24T00:00:00'}"
        Dim settings = New JsonSerializerSettings() With { _
            .DateParseHandling = DateParseHandling.None _
        }
        Dim myJsonResult = JsonConvert.DeserializeObject(Of JObject)(jsonString, settings)
        Dim dateValue = myJsonResult("REQ_DATE")
        Dim dateString = CType(dateValue, String) 'Value is 2016-01-17T12:27:57

JObject.Parse()没有需要JsonSerializerSettings的过载,因此您需要使用DeserializeObject。 此设置最终会传播到 JsonReader.DateParseHandling

或者,如果您可以 Json.NET 识别日期,但始终希望它们以 ISO 8601 格式打印,则可以将令牌重新序列化为 JSON,而不仅仅是获取字符串值:

        Dim dateValue = myJsonResult("REQ_DATE")
        Dim dateString = JsonConvert.SerializeObject(dateValue).Trim(""""c) 'Value is 2016-01-17T12:27:57

原型小提琴。 相关的 C# 问题。

当您从 JSON.NET 获取解析的日期字符串时,它将采用您的区域性的格式,如您的代码注释所示:

Dim temp As String = myJsonResult("REQ_DATE")
' temp = "1/17/2016 12:27:57 PM"

该格式为"M/d/yyyy HH:mm:ss tt",因此请使用该格式进行解析。 但由于它是适合您的文化的格式,因此您可以使用 TryParse 让 DateTime 检查/使用所有已知格式:

Dim dt As DateTime
Dim temp As String = jobj("REQ_DATE").ToString
If DateTime.TryParse(temp, dt) Then
    'dt is good to use!
    Console.WriteLine(dt.ToString)
    ' Prints: 1/17/2016 12:27:57 PM
End If
Dim myDesiredResult As String = dt.ToString("yyyy-MM-ddTHH:mm:ss")
' result: "2016-01-17T12:27:57"

如果要指定格式(最好使用 TryParseExact):

dt = DateTime.ParseExact(temp, "M/d/yyyy HH:mm:ss tt",
         CultureInfo.InvariantCulture)
Console.WriteLine(dt.ToString())
' Also prints: 1/17/2016 12:27:57 PM
日期

没有格式,因此无法更改,但对于区域性设置,日期的显示方式可能会有所不同。 您可以随心所欲地显示它,它仍然是相同的日期:

Console.WriteLine(dt.ToString("HH yyyy MM mm dd"))
Console.WriteLine(dt.ToString("yyyy-MM-ddTHH:mm:ss"))
Console.WriteLine(dt.ToString("MM/d/yyyy HH:mm:ss tt"))

回答我自己的问题。我只需在 JObject 上执行DateTime.Parse,然后按照我想要的格式进行ToString,就可以让它工作。

    Dim temp As String = myRequest("REQ_DATE").ToString
    Dim tempDateTime As DateTime = DateTime.Parse(temp.ToString)
    Dim myDesiredResult As String = tempDateTime.ToString("yyyy-MM-ddTHH:mm:ss") 

我在代码中使用了 dbc 的答案,因为它更优雅。

相关内容

  • 没有找到相关文章

最新更新