通过接口文档参数生成golang结构体struct
目录
golang的结构体要求首字母大写,而经常又需要填写tag,声明json小写输出,所以在存在大量字段的接口,定义一个struct,需要重复填写大量字段,繁琐又浪费时间,还容易手工错漏。
为了提高定义struct的声明编码效率与正确性,根据文档实际情况简单写个工具:
读取文档参数文本内容
比如以拼多多api为例:https://open.pinduoduo.com/application/document/api?id=pdd.ddk.goods.search
activity_tags INTEGER[] 商品活动标记数组,例:[4,7],4-秒杀 7-百亿补贴等
activity_type INTEGER 活动类型,0-无活动;1-秒杀;3-限量折扣;12-限时折扣;13-大促活动;14-名品折扣;15-品牌清仓;16-食品超市;17-一元幸运团;18-爱逛街;19-时尚穿搭;20-男人帮;21-9块9;22-竞价活动;23-榜单活动;24-幸运半价购;25-定金预售;26-幸运人气购;27-特色主题活动;28-断码清仓;29-一元话费;30-电器城;31-每日好店;32-品牌卡;101-大促搜索池;102-大促品类分会场;
cat_ids LONG[] 商品类目id
clt_cpn_batch_sn STRING 店铺收藏券id
clt_cpn_discount LONG 店铺收藏券面额,单位为分
clt_cpn_end_time LONG 店铺收藏券截止时间
clt_cpn_min_amt LONG 店铺收藏券使用门槛价格,单位为分
clt_cpn_quantity LONG 店铺收藏券总量
min_normal_price LONG 最小单买价格(单位为分)
only_scene_auth BOOLEAN 快手专享
opt_id LONG 商品标签ID,使用pdd.goods.opts.get接口获取
opt_ids LONG[] 商品标签id
处理首字母大写、转换参数类型、补充json tag
基于beego框架下,也可以简单调整转换成命令模式下运行:
package controllers
import (
"bufio"
"io"
"os"
"pdd-mini-go/common"
"strings"
"github.com/beego/beego/v2/core/logs"
beego "github.com/beego/beego/v2/server/web"
)
// Index Controller
type ToolController struct {
beego.Controller
}
func init() {
logs.SetLogger(logs.AdapterFile, `{"filename":"pdd.mini.log"}`)
}
//转换java api文档参数、参数类型为golang的struct结构定义
//比如:https://open.pinduoduo.com/application/document/api?id=pdd.ddk.goods.search
//http://localhost:8080/shehui/tool/struct
// @router /struct [get]
func (tool *ToolController) GenerateStructString() {
fi, err := os.Open("pdd.txt")
if err != nil {
tool.Ctx.WriteString("Error: " + err.Error())
return
}
defer fi.Close()
br := bufio.NewReader(fi)
tool.Ctx.WriteString("type data struct{\n")
for {
lineBytes, _, c := br.ReadLine()
if c == io.EOF {
break
}
one := string(lineBytes)
line := strings.Fields(one)
line[2] = tool.getStructJsonTag(line[0])
line[1] = tool.getVarType(line[0], line[1])
line[0] = common.Capitalize(line[0])
tool.Ctx.WriteString(line[0] + "\t" + line[1] + "\t" + line[2] + "\n")
}
tool.Ctx.WriteString("\n}")
}
//转换api文档上参数类型为golang的参数类型
func (tool *ToolController) getVarType(varName string, varType string) string {
switch varType {
case "INTEGER":
return "int"
case "LONG":
return "int64"
case "STRING":
return "string"
case "BOOLEAN":
return "bool"
case "INTEGER[]":
return "[]int"
case "LONG[]":
return "[]int64"
case "STRING[]":
return "[]string"
case "BOOLEAN[]":
return "[]bool"
case "OBJECT":
return varName
case "OBJECT[]":
return "[]" + varName
default:
return varName
}
}
func (tool *ToolController) getStructJsonTag(varName string) string {
return "`json:\"" + varName + "\"`"
}
输出struct内容
type data struct {
Activity_tags []int `json:"activity_tags"`
Activity_type int `json:"activity_type"`
Cat_ids []int64 `json:"cat_ids"`
Clt_cpn_batch_sn string `json:"clt_cpn_batch_sn"`
Clt_cpn_discount int64 `json:"clt_cpn_discount"`
Clt_cpn_end_time int64 `json:"clt_cpn_end_time"`
Clt_cpn_min_amt int64 `json:"clt_cpn_min_amt"`
Clt_cpn_quantity int64 `json:"clt_cpn_quantity"`
Clt_cpn_remain_quantity int64 `json:"clt_cpn_remain_quantity"`
Clt_cpn_start_time int64 `json:"clt_cpn_start_time"`
Coupon_discount int64 `json:"coupon_discount"`
Coupon_end_time int64 `json:"coupon_end_time"`
Coupon_min_order_amount int64 `json:"coupon_min_order_amount"`
Coupon_remain_quantity int64 `json:"coupon_remain_quantity"`
Coupon_start_time int64 `json:"coupon_start_time"`
Coupon_total_quantity int64 `json:"coupon_total_quantity"`
Create_at int64 `json:"create_at"`
Desc_txt string `json:"desc_txt"`
Extra_coupon_amount int64 `json:"extra_coupon_amount"`
Goods_desc string `json:"goods_desc"`
Goods_image_url string `json:"goods_image_url"`
Goods_labels []int `json:"goods_labels"`
Goods_name string `json:"goods_name"`
Goods_sign string `json:"goods_sign"`
Goods_thumbnail_url string `json:"goods_thumbnail_url"`
Has_coupon bool `json:"has_coupon"`
Has_mall_coupon bool `json:"has_mall_coupon"`
Lgst_txt string `json:"lgst_txt"`
Mall_coupon_discount_pct int `json:"mall_coupon_discount_pct"`
Mall_coupon_end_time int64 `json:"mall_coupon_end_time"`
Mall_coupon_id int64 `json:"mall_coupon_id"`
Mall_coupon_max_discount_amount int `json:"mall_coupon_max_discount_amount"`
Mall_coupon_min_order_amount int `json:"mall_coupon_min_order_amount"`
Mall_coupon_remain_quantity int64 `json:"mall_coupon_remain_quantity"`
Mall_coupon_start_time int64 `json:"mall_coupon_start_time"`
Mall_coupon_total_quantity int64 `json:"mall_coupon_total_quantity"`
Mall_cps int `json:"mall_cps"`
Mall_id int64 `json:"mall_id"`
Mall_name string `json:"mall_name"`
Merchant_type int `json:"merchant_type"`
Min_group_price int64 `json:"min_group_price"`
Min_normal_price int64 `json:"min_normal_price"`
Only_scene_auth bool `json:"only_scene_auth"`
Opt_id int64 `json:"opt_id"`
Opt_ids []int64 `json:"opt_ids"`
Opt_name string `json:"opt_name"`
Plan_type int `json:"plan_type"`
Predict_promotion_rate int64 `json:"predict_promotion_rate"`
Promotion_rate int64 `json:"promotion_rate"`
Sales_tip string `json:"sales_tip"`
Search_id string `json:"search_id"`
Service_tags []int64 `json:"service_tags"`
Serv_txt string `json:"serv_txt"`
Share_rate int `json:"share_rate"`
Subsidy_amount int `json:"subsidy_amount"`
Unified_tags []string `json:"unified_tags"`
Zs_duo_id int64 `json:"zs_duo_id"`
}
json生成struct
如果有api测试工具,可以提前拿到返回的json结果,我们还可以通过现有的json to struct的工具,直接转换成struct: