技术文摘
Golang里JSON字符串转time.Duration类型的方法
在Golang开发中,处理JSON数据是非常常见的任务。有时候,我们会遇到需要将JSON字符串转换为 time.Duration 类型的情况。这篇文章将详细介绍几种实现该转换的方法。
我们需要了解 time.Duration 类型。它表示两个时间点之间经过的时间,以纳秒为单位。在JSON数据中,它通常以字符串形式存在,例如 "1h30m" 或 "3600s"。
一种常见的方法是使用 json.Unmarshal 函数结合结构体标签。我们可以定义一个包含 time.Duration 字段的结构体,并在结构体标签中指定JSON字段名。例如:
package main
import (
"encoding/json"
"fmt"
"time"
)
type Config struct {
Timeout time.Duration `json:"timeout"`
}
func main() {
jsonStr := `{"timeout": "30s"}`
var config Config
err := json.Unmarshal([]byte(jsonStr), &config)
if err!= nil {
fmt.Println("Unmarshal error:", err)
return
}
fmt.Printf("Timeout: %v\n", config.Timeout)
}
在上述代码中,我们定义了一个 Config 结构体,其中 Timeout 字段为 time.Duration 类型。通过 json.Unmarshal 函数将JSON字符串解析到 config 结构体中,json.Unmarshal 会根据结构体标签自动处理类型转换。
另一种方法是使用自定义的 UnmarshalJSON 方法。如果我们需要更灵活的转换逻辑,可以为 time.Duration 类型定义一个自定义的 UnmarshalJSON 方法。例如:
package main
import (
"encoding/json"
"fmt"
"time"
)
type Duration time.Duration
func (d *Duration) UnmarshalJSON(b []byte) error {
var v interface{}
if err := json.Unmarshal(b, &v); err!= nil {
return err
}
switch value := v.(type) {
case float64:
*d = Duration(time.Duration(value))
case string:
var err error
tmp, err := time.ParseDuration(value)
if err!= nil {
return err
}
*d = Duration(tmp)
default:
return fmt.Errorf("invalid duration value: %v", v)
}
return nil
}
func main() {
jsonStr := `{"timeout": "30s"}`
type Config struct {
Timeout Duration `json:"timeout"`
}
var config Config
err := json.Unmarshal([]byte(jsonStr), &config)
if err!= nil {
fmt.Println("Unmarshal error:", err)
return
}
fmt.Printf("Timeout: %v\n", time.Duration(config.Timeout))
}
在这个例子中,我们定义了一个新类型 Duration,它基于 time.Duration。通过为 Duration 类型实现 UnmarshalJSON 方法,我们可以自定义JSON字符串到 time.Duration 的转换逻辑。
通过以上两种方法,我们可以在Golang中轻松地将JSON字符串转换为 time.Duration 类型,满足不同场景下的开发需求。无论是简单的结构体标签方式,还是更灵活的自定义 UnmarshalJSON 方法,都为处理这类转换提供了有效的解决方案。
TAGS: Golang 类型转换 Json字符串 time.Duration类型
- Python 竟无像样定时器?试试此方法!
- 20 年一人写出 70 万行代码 沙盒游戏“鼻祖”13 年依赖玩家捐赠存活
- 怎样使你的开源项目更具展现力
- 必试的 10 个奇妙 Python 库
- 前端工程师利用 Nodejs 实现自动发送邮件的方法
- 敏捷开发中的研发流程
- 对 TC39 提案 Module Fragments 的看法
- pipx:于虚拟环境运行 Python 应用
- Python 数值中下划线的含义是什么?
- 工业机器人的编程语言是什么?
- 今日谈线程池“动态更新”
- 一文讲透 OpenCL 框架
- 中大型组织的 DevOps 成熟度模型
- CSS 布局的核心实质为何
- Go 标准库中 Json 解析的陷阱及版本变动时的偷懒技巧