encoding/json 回顾
编解码 JSON
encoding/json 回顾 是 CoddyKit 上的免费 Go Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Go Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Go Academy 课程共包含 4 节课。
Go 中的 JSON
JSON 是 API 最常用的数据格式。Go 的标准 encoding/json 包可以在 Go 值与 JSON 文本之间进行转换。
Marshal:从 Go 到 JSON
json.Marshal 会将 Go 值转换为 JSON 字节切片。将其转换为字符串即可打印。
package main
import (
"encoding/json"
"fmt"
)
func main() {
data := map[string]int{"a": 1, "b": 2}
b, _ := json.Marshal(data)
fmt.Println(string(b))
}序列化结构体
结构体会逐字段进行序列化。导出字段会成为 JSON 键。
package main
import (
"encoding/json"
"fmt"
)
type User struct {
Name string
Age int
}
func main() {
b, _ := json.Marshal(User{"Ann", 30})
fmt.Println(string(b))
}Unmarshal:从 JSON 到 Go
json.Unmarshal 会将 JSON 字节解析为 Go 值。请传入一个指针,这样它才能填充您的变量。
package main
import (
"encoding/json"
"fmt"
)
type User struct {
Name string
Age int
}
func main() {
var u User
json.Unmarshal([]byte("{\"Name\":\"Bob\",\"Age\":25}"), &u)
fmt.Println(u)
}使用标签指定键名
使用 json 标签控制键名,前文已经介绍过这种做法。在这里,Name 会映射到 JSON 键名。
package main
import (
"encoding/json"
"fmt"
)
type User struct {
Name string "json:\"name\""
}
func main() {
b, _ := json.Marshal(User{"Ann"})
fmt.Println(string(b))
}始终检查错误
Marshal 和 Unmarshal 都会返回一个错误。在实际代码中,绝不要忽略它;格式错误的 JSON 或不支持的类型都会产生错误。
package main
import (
"encoding/json"
"fmt"
)
func main() {
var v int
err := json.Unmarshal([]byte("not json"), &v)
fmt.Println(err)
}解码到映射
如果事先不知道数据的结构,可以将其反序列化到 map[string]interface{} 中。
package main
import (
"encoding/json"
"fmt"
)
func main() {
var m map[string]interface{}
json.Unmarshal([]byte("{\"x\":1,\"y\":\"hi\"}"), &m)
fmt.Println(m["x"], m["y"])
}切片与数组
JSON 数组会映射为 Go 切片。将切片序列化后会得到一个 JSON 数组。
package main
import (
"encoding/json"
"fmt"
)
func main() {
b, _ := json.Marshal([]string{"a", "b", "c"})
fmt.Println(string(b))
}格式化输出
json.MarshalIndent 会添加缩进,使输出更易于人类阅读。
package main
import (
"encoding/json"
"fmt"
)
func main() {
data := map[string]int{"a": 1}
b, _ := json.MarshalIndent(data, "", " ")
fmt.Println(string(b))
}数字是 float64
解码到 interface{} 时,所有 JSON 数字在 Go 中都会变成 float64。如果需要 int,请显式转换。
package main
import (
"encoding/json"
"fmt"
)
func main() {
var v interface{}
json.Unmarshal([]byte("42"), &v)
fmt.Printf("%T %v\n", v, v)
}往返转换
您可以先进行序列化,再进行反序列化,通过 JSON 复制数据。对于支持的类型,值会完整地恢复。
package main
import (
"encoding/json"
"fmt"
)
func main() {
orig := []int{1, 2, 3}
b, _ := json.Marshal(orig)
var back []int
json.Unmarshal(b, &back)
fmt.Println(back)
}快速检查
为什么必须向 json.Unmarshal 传入指针?
回顾
encoding/json:
json.Marshal将 Go 值转换为 JSONjson.Unmarshal将 JSON 解析到指针指向的值中- 标签会重命名键;数字解码到 interface{} 时会变成 float64
- 始终检查返回的错误
常见问题解答
「encoding/json 回顾」课时是免费的吗?
是的 — 「encoding/json 回顾」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Go Academy 课程的其余内容,请升级到 CoddyKit PRO。 Go Academy 课程共包含 4 节课。
「encoding/json 回顾」这节课中我会学到什么?
编解码 JSON 你通过在浏览器中直接运行的动手代码来练习 Go Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Go Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Go Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「encoding/json 回顾」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Go Academy 课中编写并运行代码吗?
能。每节 Go Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- encoding/json 回顾
- encoding/xml
- encoding/csv
- gob 与二进制编码