donglan8870 2018-09-13 14:35
浏览 9
已采纳

Golang在将“ {}”主体解码为struct时不产生错误

In a rest api, when the body is set to "{}", the json Decoder will not generate an error. This makes it necessary to check if the target struct is still nil.

I need to check if the library is supposed to work like this, or if this is an issue with it.

// Client Side this request
req, err := http.NewRequest("POST", "url", strings.NewReader("{}") )

// Curl equivalent: 
curl -X POST -d '{}' http://api:8080/r/primitives/multiply

// Server side
type Operands struct {
    Values []float64 `json:"Values"`
}

func handler(req *http.Request, res *http.Response) (string, error) {
    operands := Operands{}
    err := json.NewDecoder(req.Body).Decode(&operands)
    if err != nil {
        res.StatusCode = 400
        res.Status = http.StatusText(res.StatusCode)
        http.StatusText(res.StatusCode)
        return "", err
    }
     operands.Values[0] // It will fail here.
}

Edit 1: The decoder works fine with and empty body "" with the error being generated, and works fine with a correct body like this one: {"Values" : [ 5.0 , 2.0 ]} Edit 2: The issue here is that with a "{}" body, it will not return an error when decoding, instead it will keep the target struct as nil.

  • 写回答

1条回答 默认 最新

  • douluoxiao2286 2018-09-13 15:19
    关注

    {} is just an empty Json object, and it will decode fine to your Operandsstruct, as the struct is not required to have anything in the Operands array.

    You need to validate that yourself, e.g.

    err := json.NewDecoder(req.Body).Decode(&operands)
    if err != nil || len(operands.Values) == 0{
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 公交车和无人机协同运输
  • ¥15 stm32代码移植没反应
  • ¥15 matlab基于pde算法图像修复,为什么只能对示例图像有效
  • ¥100 连续两帧图像高速减法
  • ¥15 组策略中的计算机配置策略无法下发
  • ¥15 如何绘制动力学系统的相图
  • ¥15 对接wps接口实现获取元数据
  • ¥20 给自己本科IT专业毕业的妹m找个实习工作
  • ¥15 用友U8:向一个无法连接的网络尝试了一个套接字操作,如何解决?
  • ¥30 我的代码按理说完成了模型的搭建、训练、验证测试等工作(标签-网络|关键词-变化检测)