• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

go使用json包Marshal方法得到异常结果[123125]

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

在三消项目开发过程中,使用golang中的"encoding/json"包对struct结构体进行序列化,期望得到一个json string类型的字符串,但是打印的输出结果是[123 125]。

模拟示例:


package main

import (
	"encoding/json"
	"fmt"
	"runtime"
)

type user struct {
	name     string  `json: name`
	age      uint8   `json: age`
}

func main() {
	bbq := user{
		name: "bbq",
		age:  17,
	}
	jsonStr, err := json.Marshal(bbq)
	if err != nil {
		fmt.Printf("err = %v\n", err)
		return
	}
	fmt.Printf("jsonStr = %v\n", jsonStr)
}

打印结果:

期望结果:

 

 


我们直接看下json.Marshal的代码:

可以看到,Marshal返回的值[]byte,即一个ASCII码的byte数组,[123 125]实际就是 { },[]byte类型想打印出可读的字符串,显然需要转换,我们采用string(jsonStr)的标准转换方式,打印出来的结果就是:

目前为止仅解决了打印结果不易读的问题,为什么是空json串呢,go的源码注释非常清晰,在Marshal的注释中,找到这样一段话:

 Each exported struct field becomes a member of the object,只有可导出的struct 字段才能成为json对象中的key,golang中,struct可导出的字段,是需要开头字母大写的,回过头来看项目代码,可以看到目前是小写的,

 

因为当时考虑这个结构体并不需要被外部访问,因此是小写的,没想到json.Marshal要求是大写才能转化。

 

 

解决方案


1、struct结构体中的字段名首字母大写

2、json.Marshal序列化后再做一次字符串类型转化,string()

 

示例代码修正:

package main

import (
	"encoding/json"
	"fmt"
)

type user struct {
	Name string `json: name`
	Age  uint8  `json: age`
}

func main() {
	bbq := user{
		Name: "bbq",
		Age:  17,
	}
	jsonStr, err := json.Marshal(bbq)
	if err != nil {
		fmt.Printf("err = %v\n", err)
		return
	}
	fmt.Printf("jsonStr = %s\n", string(jsonStr))
}

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap