我期望在 dotnet 6 api 中收到帶有 JSON 正文的傳入請求,其屬性是帶有時區資訊的 ISO8601 格式的時間戳,例如 2018-01-01T12:01:13.252 0200
我的控制器無法反序列化上述值,并回傳 400 回應。
如果我省略時間戳中的最后兩個零,即使用 2018-01-01T12:01:13.252 02 一切正常。
此外,如果我創建一個接受查詢字串中的日期時間的 GET 端點,則使用 0200 和 02 作為時區資訊時一切正常。
我不明白我做錯了什么,有人可以提供線索嗎?
控制器代碼:
public record TestRequest(DateTime Timestamp);
[HttpPost("test")]
public IActionResult TestNested([FromBody] TestRequest request)
{
return Ok(request.Timestamp.ToUniversalTime());
}
請求樣本 - 無效 w/400 回應
curl -X 'POST' \
'https://whatever' -H 'accept: */*' -H 'Content-Type: application/json' \
-d '{
"timestamp": "2022-10-08T14:45:08.890 0200"
}'
我得到的回應是
{
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"traceId": "00-be3ecd4cc3611f6e7a359d59c279afc2-9b36d6d2ec59b589-00",
"errors": {
"request": [
"The request field is required."
],
"$.timestamp": [
"The JSON value could not be converted to [....].TestRequest. Path: $.timestamp | LineNumber: 1 | BytePositionInLine: 45."
]
}
請求樣本 - VALID w/200 回應(注意時區中缺少最后兩個零)
curl -X 'POST' \
'https://whatever' -H 'accept: */*' -H 'Content-Type: application/json' \
-d '{
"timestamp": "2022-10-08T14:45:08.890 02"
}'
uj5u.com熱心網友回復:
該字串2018-01-01T12:01:13.252 0200格式不正確,因為它:在偏移量中缺少分隔小時和分鐘的部分。應該是2018-01-01T12:01:13.252 02:00。
如果您必須在沒有冒號的情況下傳遞它,則需要創建一個自定義JsonConverter來進行決議。有關示例,請參閱本文。
此外,由于您的資料包含時區偏移,您可能應該使用DateTimeOffset而不是DateTime.
為了詳細說明格式,當前版本的 ASP.NET Core 使用System.Text.Json,它期望時間戳采用 ISO 8601-1:2019 擴展組態檔表示。這通常簡稱為“ISO 8601”,但該規范中有許多不同的格式。
在 ISO 8601 的命名法中,適用的格式稱為“日期和時間的完整表示”(是的,它非常冗長)。這種表示有兩種有效的格式——“基本格式”和“擴展格式”。
“基本”格式省略了幾乎所有的標點符號,除了偏移量前面的符號和小數秒的小數分隔符。(
System.Text.Json默認情況下不使用這種格式。)以下都是有效的例子:
20180101T120113.252 02 20180101T120113.252 0200相比之下,“擴展”格式需要所有標點符號。(這是可以
System.Text.Json理解的格式。)以下都是有效的例子:
2018-01-01T12:01:13.252 02 2018-01-01T12:01:13.252 02:00
在這兩種情況下,偏移量都可以用整小時或小時和分鐘來指定。盡管規范支持兩者,但總是通過分鐘是合理的,因為許多時區偏移 30 分鐘(有些是 45 分鐘)。
ISO 8601 規范不允許混合基本格式和擴展格式。因此,必須包括:要合規的。擴展格式的類似規范可以在RFC 3339中找到,它也需要冒號分隔符。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/511730.html
上一篇:如何使用ADO.NETCoreSqlClient按就業日期篩選員工
下一篇:從解決方案中讀取JSON檔案
