需要使用的库有golang自带的enconding/json库以及gjson库。 主要思路是将json字符串中的值分别赋值到已经建立的结构体中,然后通过Marshal函数打印字符串输出,以便查看。
package main
import (
"bytes"
"encoding/json"
"fmt"
"github.com/gogf/gf/g/encoding/gjson"
"github.com/gogf/gf/g/util/gconv"
"log"
)
type JsonData struct {
Afid string
Raw string
}
type JsonString struct {
Code int
Data *JsonData
Msg string
callbacks []func()
}
func (js *JsonString) String() string {
b, err := json.Marshal(*js)
if err != nil {
return fmt.Sprintf("%+v", *js)
}
var out bytes.Buffer
err = json.Indent(&out, b, "", "\t")
if err != nil {
return fmt.Sprintf("%+v", *js)
}
return out.String()
}
func main(){
data := `{"code":0,"data":{"afid":"1e000000000505184b119f7ab556a2751082265acf753d02937cf7dee863011c90d1fbbc3b3dbbc785297efbf22c42a8aa36baa833402b3db129d60901ad2008","raw":";_r=true;afid=1e000000000505184b119f7ab556a2751082265acf753d02937cf7dee863011c90d1fbbc3b3dbbc785297efbf22c42a8aa36baa833402b3db129d60901ad2008;is_exist=true;"},"msg":""}`
var js JsonString = GetJsonString(data)
jStr := JsonString{
Code: js.Code,
Data: &JsonData{
Afid: js.Data.Afid,
Raw: js.Data.Raw,
},
Msg: js.Msg,
}
fmt.Println("JsonString:",jStr.String())
}
func GetJsonString(data string) JsonString {
j, err := gjson.DecodeToJson([]byte(data))
if err != nil {
log.Print(err)
js := JsonString{}
return js
} else {
js := JsonString{
Code: j.GetInt("code"),
Data:&JsonData{
Afid: j.GetString("data.afid"),
Raw: j.GetString("data.raw"),
},
Msg: j.GetString("msg"),
}
return js
}
}
输出结果:
JsonString: {
"Code": 0,
"Data": {
"Afid": "1e000000000505184b119f7ab556a2751082265acf753d02937cf7dee863011c90d1fbbc3b3dbbc785297efbf22c42a8aa36baa833402b3db129d60901ad2008",
"Raw": ";_r=true;afid=1e000000000505184b119f7ab556a2751082265acf753d02937cf7dee863011c90d1fbbc3b3dbbc785297efbf22c42a8aa36baa833402b3db129d60901ad2008;is_exist=true;"
},
"Msg": ""
}
需要注意的是,结构体中成员的变量命名,首字母必须大写。不然会导致json.Marshal()一直返回[123 125]即“{}”,原因是go中是否可导出是根据名字首字母是否大写来确定的,如果结构体某字段的首字母为小写则不可导出。