在rest api中,当主体设置为“{}”时,json解码器将不会生成错误。这使得有必要检查目标结构是否仍然是nil

我需要检查库是否应该像这样工作,或者这是否是一个问题。

// 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.
}

编辑1:解码器与空的主体“”一起正常工作,并生成错误,并且与正确的主体(例如这样)一起正常工作:{"Values" : [ 5.0 , 2.0 ]}编辑2:此处的问题在于,使用“{}”主体时,解码时不会返回错误,而是将目标结构保留为nil。

最佳答案

{}只是一个空的Json对象,它将对您的Operands结构进行很好的解码,因为该结构不需要在Operands数组中包含任何内容。

您需要验证自己,例如

err := json.NewDecoder(req.Body).Decode(&operands)
if err != nil || len(operands.Values) == 0{

关于json - Golang在将“{}”主体解码为struct时不产生错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52316045/

10-12 05:57