插件窝 干货文章 Go语言中如何将JSON字符串转换为time.Duration类型?

Go语言中如何将JSON字符串转换为time.Duration类型?

Duration 字符串 JSON time 48    来源:    2025-03-13

在Go语言中,time.Duration 类型表示一个时间段,通常以纳秒为单位。要将JSON字符串转换为 time.Duration 类型,你可以按照以下步骤进行操作:

  1. 定义结构体:首先,你需要定义一个结构体,其中包含一个 time.Duration 类型的字段。

  2. 实现自定义的 UnmarshalJSON 方法:由于 time.Duration 本身不支持直接从JSON字符串解析,因此你需要为结构体实现自定义的 UnmarshalJSON 方法。

  3. 解析JSON字符串:使用 json.Unmarshal 函数将JSON字符串解析到结构体中。

以下是一个完整的示例代码:

package main

import (
    "encoding/json"
    "fmt"
    "time"
)

// 定义一个包含 time.Duration 字段的结构体
type Config struct {
    Timeout Duration `json:"timeout"`
}

// 自定义 Duration 类型,用于实现 UnmarshalJSON 方法
type Duration time.Duration

// 实现 UnmarshalJSON 方法
func (d *Duration) UnmarshalJSON(data []byte) error {
    var s string
    if err := json.Unmarshal(data, &s); err != nil {
        return err
    }

    duration, err := time.ParseDuration(s)
    if err != nil {
        return err
    }

    *d = Duration(duration)
    return nil
}

func main() {
    // 示例 JSON 字符串
    jsonStr := `{"timeout": "5s"}`

    // 解析 JSON 字符串
    var config Config
    if err := json.Unmarshal([]byte(jsonStr), &config); err != nil {
        fmt.Println("Error:", err)
        return
    }

    // 输出解析后的 Duration
    fmt.Println("Timeout:", time.Duration(config.Timeout))
}

代码解释:

  1. 结构体定义

    • Config 结构体包含一个 Duration 类型的字段 Timeout
    • Duration 是一个自定义类型,它实际上是 time.Duration 的别名。
  2. UnmarshalJSON 方法

    • 该方法首先将JSON数据解析为字符串。
    • 然后使用 time.ParseDuration 函数将字符串解析为 time.Duration 类型。
    • 最后将解析后的 time.Duration 赋值给 Duration 类型的字段。
  3. 解析JSON字符串

    • 使用 json.Unmarshal 函数将JSON字符串解析到 Config 结构体中。
  4. 输出结果

    • 解析后的 time.Duration 值可以通过 time.Duration(config.Timeout) 进行访问。

示例输出:

Timeout: 5s

通过这种方式,你可以将JSON字符串中的时间格式(如 "5s""1h30m" 等)转换为 time.Duration 类型。