2016-02-02 132 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的答案在我的代碼,因爲它是更優雅。