Go的json解码器无法处理最简单的输入。为什么?

时间:2013-06-23 17:03:41

标签: go

我正准备在Go中编写一个AJAX类型的应用程序,这是一个示例应用程序,可以熟悉它的工作方式。但事实并非如此。 InputRec(irec)字段在解码后只有零。首先来源:

package main

import (
  "net/http"
  "encoding/json"
  "fmt"
  // "io/ioutil"
)

type InputRec struct {
  a, b float64
}

type RetRec struct {
  sum float64
}

func addHandler(w http.ResponseWriter, r *http.Request) {
  var outJson []byte
  var irec InputRec
  var orec RetRec

/*  inJson, err := ioutil.ReadAll(r.Body)
  num := len(inJson)
  if err != nil {
    panic("Error on reading body")
  }
  r.Body.Close()
  err = json.Unmarshal(inJson, &irec)
  fmt.Println("Input ", num, " bytes: ", string(inJson)) */

  decoder := json.NewDecoder(r.Body)
  err := decoder.Decode(&irec)
  if err != nil {
    panic("Error on JSON decode")
  }

  orec.sum = irec.a + irec.b
  fmt.Println("a: ", irec.a, " b: ", irec.b, " Sum: ", orec.sum)
  outJson, err = json.Marshal(orec)
  if err != nil {
    panic("Error on JSON encode")
  }

  w.Header().Set("Content-Type", "application/json")
  _, err = w.Write(outJson)
  if err != nil {
    panic("Error writing response")
  }
}

func main() {
  http.HandleFunc("/", addHandler)
  http.ListenAndServe(":1234", nil)
}

现在测试:

curl -X POST -i -d '{"a":5.4,"b":8.7}'  http://localhost:1234/
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 2
Date: Sun, 23 Jun 2013 17:01:08 GMT

{}

请注意,我知道请求体正在使用该函数,因为我已经使用注释掉的代码而不是更短的json.Decoder行尝试了它,并且它按预期打印了请求体。

当发出所述curl请求时,它显示为Println命令的输出:

a:0 b:0总和:0

很明显json字段排列到InputRec(只是a和b)所以这里有什么问题?

非常感谢!

1 个答案:

答案 0 :(得分:2)

我明白了。我结构的成员必须资本化。 :/