一尘不染

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

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中获取的Date。我看到解决此问题的两种方法:将其yyyy-MM- ddTHH:mm:ss手动转换,或使用正则表达式直接获取键值对-两种方法我都没有成功。

我尝试将其转换为DateTime:

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")

我尝试使用Regex:

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

任何帮助都将不胜感激。


阅读 241

收藏
2020-07-27

共1个答案

一尘不染

我假设这myJsonResultJObject您已将JSON加载到其中的内容。

您的困难在于Json.NET在读取时会自动将字符串识别为日期并将其转换为DateTime结构。然后,当您以后ToString()对值令牌进行操作时,它将返回为c#的“不变区域性”格式,而不是原始格式(在本例中为ISO8601)。如果您不希望出现这种情况,可以使用[`JsonSerializerSettings.DateParseHandling

DateParseHandling.None`](http://www.newtonsoft.com/json/help/html/P_Newtonsoft_Json_JsonSerializerSettings_DateParseHandling.htm)以下命令解析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
2020-07-27