golang json处理struct未导出成员
varding · · 6147 次点击 · · 开始浏览
我们用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之类的函数了
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
我们用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之类的函数了