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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值