解决apifox无法导入Go结构体

在Webgin项目开发中,作者遇到复杂结构体手动转换为JSON的困扰。通过编写一个函数,可以将Go结构体转为JSON字符串,解决了手动转换的问题。在单元测试中发现对于切片类型的字段,默认为nil时会显示为null。通过初始化切片,成功避免了这一问题,实现了结构体到JSON的有效转换。此外,也提到网上存在现成工具能完成相同功能。
摘要由CSDN通过智能技术生成

背景

最近遇到了一个问题,在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格式了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值