为了账号安全,请及时绑定邮箱和手机立即绑定

在 Golang JSON POST 请求中编组为非字符串类型

在 Golang JSON POST 请求中编组为非字符串类型

Go
呼啦一阵风 2021-12-20 10:14:51
我在 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"}所有非字符串值分别打印为0或0.000000。如果我尝试在事后输入 convert inline 也没关系,就像我t.Metric_Id在示例中所做的那样。如果我编辑结构以仅处理string类型,则值会正确打印。我还使用以下方法编写了一个 POST 路由器版本json.NewDecoder():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)}
查看完整描述

1 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

您需要更改 Datablob 值的名称。您已经告诉 JSON 解码器它们都被命名为“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"`

}


查看完整回答
反对 回复 2021-12-20
  • 1 回答
  • 0 关注
  • 127 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信