处理 struct field xxx has json tag but is not exported 的错误

在 go 语言中,通过 encoding/json 库可以很方便的处理 json 格式的数据,有时候会遇到 “struct field xxx has json tag but is not exported” 的错误。

通常我们习惯使用结构类型来定义在程序中需要处理的数据,例如在 Todo-Api 应用中,定义一个待办事项的数据结构如下:

1
2
3
4
5
6
type Todo struct {
id int
title string
desc string
done bool
}

如果需要输出为 json 格式或是将 json 格式的数据转换为该结构,只需要在程序中引入 encoding/json 库,并在类型定义中声明对应关系即可,如:

1
2
3
4
5
6
7
8
9
10
11
import (
"encoding/json"
// ...
)

type Todo struct {
id int32 `json:"id"`
title string `json:"title"`
desc string `json:"desc"`
Done bool `json:"done"`
}

看起来很简单是不是? 但如果这样写,你会得到一个 “struct field title has json tag but is not exported” 警告,程序还可以编译并运行,但如果执行了数据的输出(比如通过 http.ResponseWriter来输出),则输出为空的 json 结构,更糟糕的是程序不会报任何错误。

解决问题的方法很简单,将结构体中所有属性的名称首字母改为大写,实际上,json b
包只识别以大写字母开头的属性(这就是提示中所谓 export 的意思)。修改后的代码如下:

1
2
3
4
5
6
type Todo struct {
ID int32 `json:"id"`
Title string `json:"title"`
Desc string `json:"desc"`
Done bool `json:"done"`
}

接下来就可以简单的通过 json 库来进行输出了:

1
json.NewEncoder(w).Encode(todos)

本文标题:处理 struct field xxx has json tag but is not exported 的错误

文章作者:Morning Star

发布时间:2020年01月26日 - 12:01

最后更新:2021年04月16日 - 15:04

原始链接:https://www.mls-tech.info/golang/go-has-json-tag-but-is-not-exported/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。