golang json处理struct未导出成员


我们用golang的json来marshal一个结构体的时候,结构体的未导出的成员将无法被json访问,也就是不会出现json编码的结果里(也就是小写的成员没法导出)

这个是由于技术的上问题引起的:golang的结构体里的成员的名字如果以小写字母开头,那么其他的包是无法访问的,也就是json无法访问我们的结构体里小写字母开头的成员


这个可以有两种方法解决

1. struct的成员用大写开头,然后加tag

2. 实现json.Marshaler接口


第一种方法比较常见这儿就不详细展开了

第二种方法如下

http://play.golang.org/p/AiTwUOWkiT

package main

import "fmt"
import "encoding/json"

func main() {
	var s S
	s.a = 5
	s.b[0] = 3.123
	s.b[1] = 111.11
	s.b[2] = 1234.123
	s.c = "hello"
	s.d[0] = 0x55

	j, _ := json.Marshal(s)
	fmt.Println(string(j))
}

type S struct {
	a int
	b [4]float32
	c string
	d [12]byte
}

func (this S) MarshalJSON() ([]byte, error) {
	return json.Marshal(map[string]interface{}{
		"a": this.a,
		"b": this.b,
		"c": this.c,
		"d": this.d,
	})
}

输出:

{"a":5,"b":[3.123,111.11,1234.123,0],"c":"hello","d":[85,0,0,0,0,0,0,0,0,0,0,0]}


也就是结构体实现MarshalJSON() ([]byte, error)函数即可,在这个函数里导出你想要导出的成员就可以了。

这样就可以正常的使用json.Marshal之类的函数了


golang json处理struct未导出成员,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。