在 go 语言中,通过 encoding/json 库可以很方便的处理 json 格式的数据,有时候会遇到 “struct field xxx has json tag but is not exported” 的错误。
通常我们习惯使用结构类型来定义在程序中需要处理的数据,例如在 Todo-Api 应用中,定义一个待办事项的数据结构如下:
1 | type Todo struct { |
如果需要输出为 json 格式或是将 json 格式的数据转换为该结构,只需要在程序中引入 encoding/json 库,并在类型定义中声明对应关系即可,如:
1 | import ( |
看起来很简单是不是? 但如果这样写,你会得到一个 “struct field title has json tag but is not exported” 警告,程序还可以编译并运行,但如果执行了数据的输出(比如通过 http.ResponseWriter来输出),则输出为空的 json 结构,更糟糕的是程序不会报任何错误。
解决问题的方法很简单,将结构体中所有属性的名称首字母改为大写,实际上,json b
包只识别以大写字母开头的属性(这就是提示中所谓 export 的意思)。修改后的代码如下:
1 | type Todo struct { |
接下来就可以简单的通过 json 库来进行输出了:
1 | json.NewEncoder(w).Encode(todos) |