2016-02-02 137 views
1

在我的VB.NET项目中,使用JSON.NET,我从Web API获取JSON,该值具有代表yyyy-MM-ddTHH:mm:ss格式中日期的值,喜欢简单地获得这个价值。JSON.NET:获取特定的JSON日期值

这或多或少是什么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,或者使用regex直接获取键值对 - 这两者我都没有成功。

我试图把它转换成日期时间:

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... 

任何及所有帮助是极大的赞赏。

回答

2

我认为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 

原型fiddle。相关c# question

+0

有趣。我已经设法使这个工作与我的答案一致,但是这解释了自动转换 - 而且解决方案更加优雅。 – chakeda

1

当你从JSON.NET得到解析日期字符串时,它会在你的文化的格式显示在你的代码注释:

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

即格式为“M/d/YYYY HH:MM: ss tt“,所以使用该格式进行解析。但由于它是在你的文化的格式,你可以让DateTime的检查/使用使用TryParse所有已知的格式:

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

谢谢 - 基于你的回答,我已经得到它的工作。具体来说,请参阅下面的答案。我用'DateTime.Parse'代替 – chakeda

1

回答我自己的问题。我只是通过在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的答案在我的代码,因为它是更优雅。