golang解析json字符串输出结构体

需要使用的库有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中是否可导出是根据名字首字母是否大写来确定的,如果结构体某字段的首字母为小写则不可导出。

你可能感兴趣的:(golang解析json字符串输出结构体)