在Go语言中,time.Duration
类型表示一个时间段,通常以纳秒为单位。要将JSON字符串转换为 time.Duration
类型,你可以按照以下步骤进行操作:
定义结构体:首先,你需要定义一个结构体,其中包含一个 time.Duration
类型的字段。
实现自定义的 UnmarshalJSON
方法:由于 time.Duration
本身不支持直接从JSON字符串解析,因此你需要为结构体实现自定义的 UnmarshalJSON
方法。
解析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))
}
结构体定义:
Config
结构体包含一个 Duration
类型的字段 Timeout
。Duration
是一个自定义类型,它实际上是 time.Duration
的别名。UnmarshalJSON
方法:
time.ParseDuration
函数将字符串解析为 time.Duration
类型。time.Duration
赋值给 Duration
类型的字段。解析JSON字符串:
json.Unmarshal
函数将JSON字符串解析到 Config
结构体中。输出结果:
time.Duration
值可以通过 time.Duration(config.Timeout)
进行访问。Timeout: 5s
通过这种方式,你可以将JSON字符串中的时间格式(如 "5s"
、"1h30m"
等)转换为 time.Duration
类型。