Golang struct,map,json 之间的转换
起步
利用 Go 写一个项目时,比如常见的 web server,很容易涉及到 struct,map,json 三者之间的转换。这里想简单总结下,帮助一些刚入坑的朋友。
struct <=> json
不论是 struct => json 还是 json => struct 都尤为简单,这是因为标准库 encoding/json 提供了友好的 API。
示例代码如下:
// struct_json_test.go
package main
import (
"encoding/json"
"log"
"reflect"
"testing"
)
// StructToJSON ...
func StructToJSON(o interface{
}) string {
// 确保 o 是结构体(没有必要时,校验代码可以删除)
if reflect.TypeOf(o).Kind() != reflect.Struct {
log.Fatal("need struct")
}
// []byte, error
strJSON, _ := json.Marshal(o)
// []byte => string
return string(strJSON)
}
// JSONToStruct ...
func JSONToStruct(s string, targetPtr interface{
}) {
// string => []byte
sBytes := []byte(s)
// 填充目标结构体
json.Unmarshal(sBytes, targetPtr)
}
// TestCurCode ...
func TestCurCode(t *testing.T) {
// 定义一个 Student 结构体
type Student struct {
Name string
Age int
}
stu := Student{
"zty", 18}
strJSON := StructToJSON(stu)
t.Logf("type: %T\n", strJSON)
t.Logf("value: %s\n", strJSON)
// 定义一个 JSON 字符串
var JSONStr = `
{
"Name": "zty",
"Age": 18
}
`
target := Student{
}
JSONToStruct(JSONStr, &target)
t.Logf("type: %T\n", target)
t.Logf("value: %v\n", target)
}
struct 与 json 之间的转换主要靠两个 API:
- json.Marshal
- json.Unmarshal
需要注意 json.Unmarshal 的第二个参数是目标结构体的地址。
map <=> json
// struct_json_test.go
package main
import (
"encoding/json"
"testing"