在Golang的JSON POST请求中,将数据转换为非字符串类型的方法是什么?

huangapple go评论83阅读模式
英文:

Marshalling to NonString type in Golang JSON POST Request

问题

我在处理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)
}

这是基于此答案中描述的功能构建的,尽管该解决方案似乎不起作用。

感谢您的帮助!

英文:

I'm having a little bit of trouble handling types in Golang. I'm making a POST router.

Consider the following 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"`
}

This is my POST router using json.Unmarshal() from a decoded stream:

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)
}

It seems that no matter what I make my values in my POST request:

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

All the non-String values print as 0 or 0.000000, respectively. It also doesn't matter if I try to type convert inline after-the-fact, as I did with t.Metric_Id in the example.

If I edit my struct to just handle string types, the values print correctly.

I also wrote a version of the POST router using 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)
}

This is building off of functionality described in this answer, although the solution doesn't appear to work.

I appreciate your help!

答案1

得分: 1

你需要更改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"`
}
英文:

You need to change the names of your Datablob values. You've told the JSON decoder that they're all named "id". You should try something like the following. Also, take a look at the json.Marshal description and how it describes the tags for structs and how the json library handles them. 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"`
}

huangapple
  • 本文由 发表于 2016年2月28日 03:57:26
  • 转载请务必保留本文链接:https://go.coder-hub.com/35674730.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定