Golang 的 Json处理
Json 编码
使用 json.Marshal
//go:generate goversioninfo
package main
import (
"encoding/json"
"fmt"
)
func main() {
// 映射转 Json str
marshal, _ := json.Marshal(map[string]string{"key": "value"})
fmt.Println(string(marshal))
// 数组转 Json str
marshal, _ = json.Marshal([2]string{"hello", "world"})
fmt.Println(string(marshal))
// 结构体转 Json str
marshal, _ = json.Marshal(struct {
Name string `json:"name"`
Age int `json:"age"`
}{
Name: "小明",
Age: 10,
})
fmt.Println(string(marshal))
}
Json 转码
使用 json.Unmarshal
//go:generate goversioninfo
package main
import (
"encoding/json"
"fmt"
)
func main() {
// Json 转 Map
jsonStr := `{"name":"小明","age":30,"city":"Tokyo"}`
jsonObj := make(map[string]interface{})
_ = json.Unmarshal([]byte(jsonStr), &jsonObj)
fmt.Println(jsonObj)
// Json 转 Slice
jsonStr1 := `["hello", "world"]`
jsonObj2 := make([]string, 0)
_ = json.Unmarshal([]byte(jsonStr1), &jsonObj2)
fmt.Println(jsonObj2)
// Json 转结构体 设计参考类型
jsonObj3 := struct {
Name string `json:"name"`
Age string `json:"age"`
City string `json:"city"`
}{}
_ = json.Unmarshal([]byte(jsonStr), &jsonObj3)
fmt.Println(jsonObj3.Name, jsonObj3.Age, jsonObj3.City)
}
空接口
空接口 interface{} 可以是任何类型的值
package main
import "fmt"
func main() {
// 空接口
var i interface{}
i = "a string"
i = 2024
i = 3.14
// 类型断言
// 语法:value, ok := i.(T)
// 断言成功会返回值和true,否则返回断言类型的默认值和false
v, ok := i.(int)
fmt.Println(v, ok)
// 类型匹配
switch i.(type) {
case int:
fmt.Println("int")
case string:
fmt.Println("string")
case float64:
fmt.Println("float64")
default:
fmt.Println("unknown")
}
}
解码任意格式Json
package main
import (
"encoding/json"
"fmt"
)
func main() {
jsonStr := `{"name":"小明", "age":18, "gender":"男", "high":1.75}`
var v interface{}
_ = json.Unmarshal([]byte(jsonStr), &v)
m := v.(map[string]interface{})
for k, j := range m {
fmt.Println(k, j)
}
}
评论