Go API中MySQL返回空行时,如何将Result字段从null改为空JSON对象?
解决Go API中MySQL无结果时的JSON响应问题
咱们先搞明白核心问题:你定义的Resp结构体里,Result是[]map[string]interface{}类型(也就是切片),而Go的JSON序列化规则里,nil切片会被转成null,但你想要的{}是JSON对象,对应的Go类型是map[string]interface{}——这俩类型不匹配,所以才会出现和预期不一样的结果。
下面给你两种解决方案,对应不同的需求:
方案一:确实需要result是JSON对象({})
如果你的业务逻辑就是要求result字段是JSON对象,那得先修改结构体的类型:
type Resp struct { Result map[string]interface{} `json:"result"` // 把切片改成map类型 Status string `json:"status"` }
然后在MySQL查询返回0行时,主动给Result赋值一个空map(而不是让它保持nil):
// 处理查询结果的逻辑 resp := Resp{} rows, err := db.Query(...) if err != nil { // 处理错误 resp.Result = make(map[string]interface{}) // 初始化空map,序列化后是{} resp.Status = "failed" } else { defer rows.Close() if !rows.Next() { // 没有查询到数据 resp.Result = make(map[string]interface{}) resp.Status = "failed" } else { // 正常解析数据到map里,赋值给resp.Result resp.Status = "success" } } // 序列化响应返回 w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(resp)
这样返回的响应就是你想要的{"result": {}, "status": "failed"}。
方案二:实际想要result是JSON数组([])
如果是你笔误,其实希望result是JSON数组(毕竟原结构体用的是切片),那不用改结构体,只需要在无结果时给Result赋值一个空切片就行:
// 处理查询结果的逻辑 resp := Resp{} results, err := queryDatabase() // 假设这个函数返回[]map[string]interface{}和错误 if err != nil || len(results) == 0 { // 出错或无数据时,赋值空切片 resp.Result = []map[string]interface{}{} resp.Status = "failed" } else { resp.Result = results resp.Status = "success" } // 序列化返回 w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(resp)
这时候无数据的响应会是{"result": [], "status": "failed"},避免了null的出现。
核心要点就是:不要让Result字段保持nil状态,主动给它赋值对应的空值(空map或空切片),这样JSON序列化时就会输出你想要的空结构,而不是null。
内容的提问来源于stack exchange,提问作者siri
相关产品推荐
相关产品推荐

