Unmarshal解析JSON字符串
package main
import (
"encoding/json"
"fmt"
)
// 准备解析结构体
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
// 准备JSON数据
data := `{"name":"zhangsan","age":33}`
// 解析JSON字符串
var p Person
json.Unmarshal([]byte(data), &p)
// 查看解析结果
fmt.Println(p.Name, p.Age)
}Marshal将对象转换为JSON字符串
package main
import (
"encoding/json"
"fmt"
)
// 准备解析结构体
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
// 准备对象
p := Person{
Name: "zs",
Age: 22,
}
// 将对象转换为JSON字符串
data, err := json.Marshal(p)
if err != nil {
panic(err)
}
// 查看解析结果
fmt.Println(string(data))
}将对象保存为JSON文件
package main
import (
"encoding/json"
"os"
)
// 准备解析结构体
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
// 准备对象
p := Person{
Name: "zs",
Age: 22,
}
// 创建文件
f, err := os.Create("tmp.json")
if err != nil {
panic(err)
}
// 写入JSON
encodeJson := json.NewEncoder(f)
err = encodeJson.Encode(p)
if err != nil {
panic(err)
}
}读取JSON文件为对象
package main
import (
"encoding/json"
"fmt"
"os"
)
// 准备解析结构体
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
// 打开文件
f, err := os.Open("tmp.json")
if err != nil {
panic(err)
}
// 读取JSON
decodeJson := json.NewDecoder(f)
var p Person
err = decodeJson.Decode(&p)
if err != nil {
panic(err)
}
// 查看读取结果
fmt.Println(p.Name, p.Age)
}封装便捷方法
通过前面的学习,我们应该能够掌握:
- 将Go对象转换为JSON字符串
- 将JSON字符串转换为Go对象
- 将Go对象保存为JSON文件
- 将JSON文件加载为Go对象
有了这四个核心功能以后,我们可以进行简单的封装,可以设计如下方法:
- toJson:将Go对象转换为JSON字符串
- fromJson:将JSON字符串转换为Go对象
- writeJson:将Go对象保存为JSON文件
- readJson:将JSON文件读取为Go对象
示例代码:
package main
import (
"encoding/json"
"fmt"
"os"
)
// 准备解析结构体
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
// ● toJson:将Go对象转换为JSON字符串
func toJson(obj interface{}) ([]byte, error) {
return json.Marshal(obj)
}
// ● fromJson:将JSON字符串转换为Go对象
func fromJson(data string, obj interface{}) error {
return json.Unmarshal([]byte(data), obj)
}
// ● writeJson:将Go对象保存为JSON文件
func writeJson(filename string, obj interface{}) error {
// 创建文件
f, err := os.Create(filename)
if err != nil {
return err
}
// 写入JSON
encodeJson := json.NewEncoder(f)
err = encodeJson.Encode(obj)
if err != nil {
return err
}
return nil
}
// ● readJson:将JSON文件读取为Go对象
func readJson(filename string, obj interface{}) error {
// 打开文件
f, err := os.Open(filename)
if err != nil {
return err
}
// 读取JSON
decodeJson := json.NewDecoder(f)
err = decodeJson.Decode(obj)
if err != nil {
return err
}
return nil
}
func main() {
// 转换JSON字符串
p := Person{
Name: "zs",
Age: 22,
}
v, _ := toJson(p)
fmt.Println(string(v))
// 读取JSON字符串
var p1 Person
_ = fromJson(string(v), &p1)
fmt.Println(p1.Name, p1.Age)
// 保存为JSON文件
filename := "tmp1.json"
_ = writeJson(filename, &p1)
// 读取JSON文件
var p2 Person
_ = readJson(filename, &p2)
fmt.Println(p2.Name, p2.Age)
}