0Pricing
Go Academy · 课时

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 值转换为 JSON
  • json.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 反馈 — 无需本地设置。

此课程中的所有课时

  1. encoding/json 回顾
  2. encoding/xml
  3. encoding/csv
  4. gob 与二进制编码
← 返回 Go Academy