背景
最近遇到了一个问题,在web gin项目开发的过程中,需要封装并发送网络请求
Body中的数据一般就是前端发给后端的参数,这些参数和后端Golang接收前端参数的结构体是一致的,如果参数(结构体)比较复杂的话,人为手动去写的话,很比较,不符合程序员的身份。
解决过程
可以看到图片上面有一个json 智能识别快速导入,于是我就想了,我可以用代码把Go的结构体转化成json格式的字符串,然后再粘贴进去不就相当于实现了apifox导入golang结构体了吗?
一:封装方法
//o是结构体对象
func structToJson(o interface{}) (jsonString string, err error) {
jsons, err := json.Marshal(o)
if err != nil {
return
}
jsonString = string(jsons)
fmt.Println(jsonString)
return jsonString, err
}
二:封装单元测试,测试函数是否正确
func Test_structToJson(t *testing.T) {
type args struct {
o interface{}
}
p := request.CreateExamManagement{}
tests := []struct {
name string
args args
wantJsonString string
wantErr bool
}{
// TODO: Add test cases.
{
name:"第一次测试",
args: args{
o: p,
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
gotJsonString, err := structToJson(tt.args.o)
if (err != nil) != tt.wantErr {
t.Errorf("structToJson() error = %v, wantErr %v", err, tt.wantErr)
return
}
if gotJsonString != tt.wantJsonString {
t.Errorf("structToJson() gotJsonString = %v, want %v", gotJsonString, tt.wantJsonString)
}
})
}
}
然后执行,看一下json的字符串
{
"exam_name": "",
"exam_type": 0,
"exam_type_name": "",
"exam_price": "",
"passing_grade": "",
"exam_duration": "",
"number_of_points": "",
"minimum_submission_time": "",
"time_allowed_to_be_late": "",
"notes_on_exam": "",
"thank_you_after_the_exam": "",
"password_password": "",
"total_score": "",
"exam_authority": "",
"exam_time_start": "0001-01-01T00:00:00Z",
"exam_time_end": "0001-01-01T00:00:00Z",
"limit_exam_time": false,
"number_of_exams": 0,
"exam_result_display": 0,
"exam_paper_id": 0,
"exam_created_by": 0,
"exam_department_id": null,
"user_id": null
}
可以看到结构体最后两个是有问题,结构是null,但是在原来的结构体中可不是这样的,结构体定义如下
type CreateExamManagement struct {
ExamName string `json:"exam_name" gorm:"comment:考试名称"`
ExamType uint `json:"exam_type" gorm:"comment:考试类型"`
ExamTypeName string `json:"exam_type_name" gorm:"comment:考试类型具体名称"`
ExamPrice string `json:"exam_price" gorm:"comment:考试价格"`
PassingGrade string `json:"passing_grade" gorm:"comment:及格分"`
ExamDuration string `json:"exam_duration" gorm:"comment:考试时长"`
NumberOfPoints string `json:"number_of_points" gorm:"comment:积分数量"`
MinimumSubmissionTime string `json:"minimum_submission_time" gorm:"comment:最低交卷时长"`
TimeAllowedToBeLate string `json:"time_allowed_to_be_late" gorm:"comment:允许迟到时长"`
NotesOnExam string `json:"notes_on_exam" gorm:"comment:考前注意事项"`
ThankYouAfterTheExam string `json:"thank_you_after_the_exam" gorm:"comment:考后感谢文字"`
PasswordPassword string `json:"password_password" gorm:"comment:口令密码"`
TotalScore string `json:"total_score" gorm:"comment:考试总分"`
ExamAuthority string `json:"exam_authority" gorm:"comment:考试权限"` //(1代表完全公开,2代表部门开放,3代表指定人员,4代表口令密码)
ExamTimeStart time.Time `json:"exam_time_start" gorm:"comment:考试开始时间"`
ExamTimeEnd time.Time `json:"exam_time_end" gorm:"comment:考试结束时间"`
LimitExamTime bool `json:"limit_exam_time" gorm:"comment:限制考试时间"`
NumberOfExams uint `json:"number_of_exams" gorm:"comment:限考次数"`
ExamResultDisplay uint `json:"exam_result_display" gorm:"comment:考试结果显示"` // (1代表仅感谢文字,2代表感谢文字+成绩,3代表显示试卷明细)
ExamPaperId uint `json:"exam_paper_id" gorm:"comment:试卷Id"`
ExamCreatedBy uint `json:"exam_created_by" gorm:"comment:考试创建人"`
ExamDepartmentId []uint `json:"exam_department_id" gorm:"comment:考试所属部门Id"`
UserId []uint `json:"user_id" gorm:"comment:指定人员id"`
}
可以看到,最后的ExamDepartmentId 和 UserId 是两个切片,切片如果不复制的话,默认就是nil,所以转化为json的时候会变成null。
那我们在声明结构体对象的时候,把是引用类型的数据(切片,通道等)都复制一下。
再尝试一下,结果如下
{
"exam_name": "",
"exam_type": 0,
"exam_type_name": "",
"exam_price": "",
"passing_grade": "",
"exam_duration": "",
"number_of_points": "",
"minimum_submission_time": "",
"time_allowed_to_be_late": "",
"notes_on_exam": "",
"thank_you_after_the_exam": "",
"password_password": "",
"total_score": "",
"exam_authority": "",
"exam_time_start": "0001-01-01T00:00:00Z",
"exam_time_end": "0001-01-01T00:00:00Z",
"limit_exam_time": false,
"number_of_exams": 0,
"exam_result_display": 0,
"exam_paper_id": 0,
"exam_created_by": 0,
"exam_department_id": [],
"user_id": []
}
成功了,以后我们就可以使用这个函数把结构体转化成json格式的数据,然后一下导入到apifox中了
=====================2023年2月22日 16:03:12更新=====================
转念一下,网上肯定有现成的工具呀,于是一搜索,确实有,直接把Golang结构体放进去,直接就成json格式了