在Golang JSON POST请求

时间:2016-02-27 19:57:27

标签: json go

我在处理Golang中的类型方面遇到了一些麻烦。我正在制作一个POST路由器。

考虑以下struct

type DataBlob struct {
    Timestamp string
    Metric_Id int `json:"id,string,omitempty"`
    Value float32 `json:"id,string,omitempty"`
    Stderr float32 `json:"id,string,omitempty"`
}

这是我使用解码流中的json.Unmarshal()的POST路由器:

func Post(w http.ResponseWriter, req * http.Request) {
    body, err := ioutil.ReadAll(req.Body)
    if err != nil {
        panic()
    }

    var t DataBlob
    err = json.Unmarshal(body, &t)
    if err != nil {
        panic()
    }

    fmt.Printf("%s\n", t.Timestamp)
    fmt.Printf("%d\n", int(t.Metric_Id))
    fmt.Printf("%f\n", t.Value)
    fmt.Printf("%f\n", t.Stderr)
}

似乎无论我在POST请求中创建了什么值:

{
    "timestamp": "2011-05-16 15:36:38",
    "metric_id": "28",
    "value": "4.5",
    "stderr": "8.5"
}

所有非字符串值分别打印为00.000000。如果我尝试在事后输入内联转换也没有关系,就像我在示例中使用t.Metric_Id一样。

如果我编辑我的结构只处理string类型,则值可以正确打印。

我还使用json.NewDecoder()编写了一个POST路由器版本:

func Post(w http.ResponseWriter, req * http.Request) {
    decoder := json.NewDecoder(req.Body)

    var t DataBlob
    err := decoder.Decode(&t)
    if err != nil {
        panic()
    }

    fmt.Printf("%s\n", t.Timestamp)
    fmt.Printf("%d\n", t.Metric_Id)
    fmt.Printf("%f\n", t.Value)
    fmt.Printf("%f\n", t.Stderr)
}

这是基于functionality described in this answer的建立,虽然解决方案似乎不起作用。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您需要更改Datablob值的名称。您告诉JSON解码器他们已全部命名为#id; id"。你应该尝试类似以下的东西。另外,看看json.Marshal描述以及它如何描述结构的标记以及json库如何处理它们。 https://golang.org/pkg/encoding/json/#Marshal

type DataBlob struct {
    Timestamp string
    Metric_Id int `json:"metric_id,string,omitempty"`
    Value float32 `json:"value,string,omitempty"`
    Stderr float32 `json:"stderr,string,omitempty"`
}