」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何在 Go 中自訂解組非標準 JSON 時間格式?

如何在 Go 中自訂解組非標準 JSON 時間格式?

發佈於2024-12-23
瀏覽:341

How to Custom Unmarshal Non-Standard JSON Time Formats in Go?

非標準JSON 時間格式的自訂取消/編組

處理包含非標準格式時間值的JSON 資料時,內建JSON 解碼器可能會遇到錯誤。為了處理這種情況,可以實作自訂編組和解組函數。

考慮以下 JSON:

{
    "name": "John",
    "birth_date": "1996-10-07"
}

以及所需的 Go 架構:

type Person struct {
    Name string `json:"name"`
    BirthDate time.Time `json:"birth_date"`
}

使用標準 JSON 解碼器在解析「birth_date」欄位時會導致錯誤。若要自訂此行為,可以建立類型別名並將其新增至結構:

type JsonBirthDate time.Time

然後,實作自訂編組和解組函數:

func (j *JsonBirthDate) UnmarshalJSON(b []byte) error {
    s := strings.Trim(string(b), `"`) // Remove quotes
    t, err := time.Parse("2006-01-02", s)
    if err != nil {
        return err
    }
    *j = JsonBirthDate(t)
    return nil
}

func (j JsonBirthDate) MarshalJSON() ([]byte, error) {
    return json.Marshal(time.Time(j))
}

透過這些自訂函數,現在可以將 JSON 解碼為 Go 結構體:

person := Person{}

decoder := json.NewDecoder(req.Body);

if err := decoder.Decode(&person); err != nil {
    log.Println(err)
}

// Print the birth date using the Format function
fmt.Println(person.BirthDate.Format("2006-01-02"))
最新教學 更多>
  • 為什麼PYTZ最初顯示出意外的時區偏移?
    為什麼PYTZ最初顯示出意外的時區偏移?
    與pytz 最初從pytz獲得特定的偏移。例如,亞洲/hong_kong最初顯示一個七個小時37分鐘的偏移: 差異源利用本地化將時區分配給日期,使用了適當的時區名稱和偏移量。但是,直接使用DateTime構造器分配時區不允許進行正確的調整。 example pytz.timezone(&#...
    程式設計 發佈於2025-04-15
  • HTML格式標籤
    HTML格式標籤
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    程式設計 發佈於2025-04-15
  • 精通MobX:React簡化與響應式狀態管理
    精通MobX:React簡化與響應式狀態管理
    [2 MOBX是用于JavaScript应用程序的流行状态管理库,尤其是在React中。与Redux依赖于集中式商店和明确的行动派遣不同,MOBX采取了一种更具反应性的方法来管理状态。它通过跟踪依赖项并在状态更改时仅重新渲染应用程序的必要部分来自动更新您的应用程序的状态和UI。 ...
    程式設計 發佈於2025-04-15
  • FastAPI自定義404頁面創建指南
    FastAPI自定義404頁面創建指南
    response = await call_next(request) if response.status_code == 404: return RedirectResponse("https://fastapi.tiangolo.com") else: ...
    程式設計 發佈於2025-04-15
  • 為什麼PHP的DateTime :: Modify('+1個月')會產生意外的結果?
    為什麼PHP的DateTime :: Modify('+1個月')會產生意外的結果?
    使用php dateTime修改月份:發現預期的行為在使用PHP的DateTime類時,添加或減去幾個月可能並不總是會產生預期的結果。正如文檔所警告的那樣,“當心”這些操作的“不像看起來那樣直觀。 考慮文檔中給出的示例:這是內部發生的事情: 現在在3月3日添加另一個月,因為2月在2001年只有2...
    程式設計 發佈於2025-04-15
  • 自定義頭為何出現在AJAX請求的Access-Control-Request-Headers中?
    自定義頭為何出現在AJAX請求的Access-Control-Request-Headers中?
    理解訪問控制請求請求標題在使用jquery通過ajax進行HTTP請求時,處理訪問權限的訪問控制問題對於交叉 - 軌道請求的處理至關重要。其中一個方面是將自定義標頭添加到請求中。 Interestingly, upon examining the request using FireBug, it...
    程式設計 發佈於2025-04-15
  • 如何高效調試CSS `calc()`值?
    如何高效調試CSS `calc()`值?
    CCSS calc()值deble debugging 確保您的公式遵守以下規則:White space is required on both sides of and - operators.How to Debug Calculated Value:You cannot direct...
    程式設計 發佈於2025-04-15
  • 為什麼儘管有效代碼,為什麼在PHP中捕獲輸入?
    為什麼儘管有效代碼,為什麼在PHP中捕獲輸入?
    在php ;?>" method="post">The intention is to capture the input from the text box and display it when the submit button is clicked.但是,輸出...
    程式設計 發佈於2025-04-15
  • Python讀取CSV文件UnicodeDecodeError終極解決方法
    Python讀取CSV文件UnicodeDecodeError終極解決方法
    在試圖使用已內置的CSV模塊讀取Python中時,CSV文件中的Unicode Decode Decode Decode Decode decode Error讀取,您可能會遇到錯誤的錯誤:無法解碼字節 在位置2-3中:截斷\ uxxxxxxxx逃脫當CSV文件包含特殊字符或Unicode的路徑逃...
    程式設計 發佈於2025-04-15
  • Java中應避免使用`synchronized(this)`嗎?
    Java中應避免使用`synchronized(this)`嗎?
    應該避免Java中的同步(此)? 當鎖定是一個潛在的關注時,由於意外訪問鎖定是無意識的。使用同步(此)時,鎖成為班級暴露接口的一部分,應相應地記錄。在某些情況下,其他代碼可能有意訪問鎖定,例如使用Collections.synchronizedMap。 何時使用同步(this) ,儘...
    程式設計 發佈於2025-04-15
  • Python中何時用"try"而非"if"檢測變量值?
    Python中何時用"try"而非"if"檢測變量值?
    使用“ try“ vs.” if”來測試python 在python中的變量值,在某些情況下,您可能需要在處理之前檢查變量是否具有值。在使用“如果”或“ try”構建體之間決定。 “ if” constructs result = function() 如果結果: 對於結果: ...
    程式設計 發佈於2025-04-15
  • C++初始化字段的最佳方式:初始化列表 vs 構造函數體
    C++初始化字段的最佳方式:初始化列表 vs 構造函數體
    在構造函數中初始化字段:初始化器列表和構造函數主體之間的差異在C中,構造函數在對象創建過程中提供了一種方便的方法來初始化實例字段。構造函數中的字段初始化有兩種主要方法:初始化器列表和構造函數主體。 thing(int _foo,int _bar):成員1(_foo)(_foo),成員2(_bar...
    程式設計 發佈於2025-04-15
  • 如何檢查對像是否具有Python中的特定屬性?
    如何檢查對像是否具有Python中的特定屬性?
    方法來確定對象屬性存在尋求一種方法來驗證對像中特定屬性的存在。考慮以下示例,其中嘗試訪問不確定屬性會引起錯誤: >>> a = someClass() >>> A.property Trackback(最近的最新電話): 文件“ ”,第1行, attributeError:SomeClass實...
    程式設計 發佈於2025-04-15
  • 為什麼使用Firefox後退按鈕時JavaScript執行停止?
    為什麼使用Firefox後退按鈕時JavaScript執行停止?
    導航歷史記錄問題:JavaScript使用Firefox Back Back 此行為是由瀏覽器緩存JavaScript資源引起的。要解決此問題並確保在後續頁面訪問中執行腳本,Firefox用戶應設置一個空功能。 警報'); }; alert('inline Alert')...
    程式設計 發佈於2025-04-15
  • 哪種在JavaScript中聲明多個變量的方法更可維護?
    哪種在JavaScript中聲明多個變量的方法更可維護?
    在JavaScript中聲明多個變量:探索兩個方法在JavaScript中,開發人員經常遇到需要聲明多個變量的需要。對此的兩種常見方法是:在單獨的行上聲明每個變量: 當涉及性能時,這兩種方法本質上都是等效的。但是,可維護性可能會有所不同。 第一個方法被認為更易於維護。每個聲明都是其自己的語句,使...
    程式設計 發佈於2025-04-15

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3