在我的 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 的答案,因为它更优雅。