在我的VB.NET项目中,使用
JSON.NET,我从Web API获得了一个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手动,或使用正则表达式直接获取键值对 – 这两者都没有成功.
我尝试将其转换为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")
我试图使用正则表达式:
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...
非常感谢任何和所有的帮助.
我假设myJsonResult是一个加载了JSON的JObject.
您的困难在于Json.NET在读取时自动将字符串识别为日期并将其转换为DateTime结构.然后,当您稍后对值标记执行ToString()时,它将以c#的“不变文化”格式返回,而不是原始格式,在本例中为ISO 8601.如果您不想要此行为,则可以使用解析JSON JsonSerializerSettings.DateParseHandling = DateParseHandling.None
:
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
原型fiddle.相关c# question.