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

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

Duration 字符串 JSON 类型 637    来源:    2025-03-14

在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"
)

// 定义结构体
type Config struct {
    Timeout Duration `json:"timeout"`
}

// 自定义Duration类型
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字符串
    jsonData := `{"timeout": "5m30s"}`

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

    // 输出结果
    fmt.Println("Timeout:", time.Duration(config.Timeout))
}

代码解释:

  1. 结构体定义

    • Config 结构体包含一个 Timeout 字段,类型为 Duration
  2. 自定义 Duration 类型

    • Duration 类型是对 time.Duration 的简单包装。
  3. UnmarshalJSON 方法

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

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

    • 最后,将解析后的 time.Duration 值输出。

运行结果:

Timeout: 5m30s

通过这种方式,你可以将JSON字符串中的时间格式(如 "5m30s")转换为 time.Duration 类型,并在程序中使用。