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

Go 通过 JSON API 将嵌套结构映射到具有相同数据的不同嵌套结构

Go 通过 JSON API 将嵌套结构映射到具有相同数据的不同嵌套结构

Go
holdtom 2022-01-10 16:49:45
使用 Go,我想接受一个带有 json 数据的请求,并将其转换为不同的结构以用于传出的 json 请求。这是我的意思的一个例子:package mainimport (    "encoding/json"    "fmt"    "net/http")type Greetings struct {    Greetings []Greeting `json:"data"`}type Greeting struct {    From     string `json:"from"`    To       string `json:"to"`    Greeting string `json:"greeting"`}type RelationShip struct {    Messages []Message `json:"data"`}type Message struct {    From    string `json:"from"`    To      string `json:"to"`    Message string `json:"message"`}func main() {    http.HandleFunc("/", Greet)    http.ListenAndServe(":3000", nil)}func Greet(rw http.ResponseWriter, request *http.Request) {    decoder := json.NewDecoder(request.Body)    var greetings Greetings    err := decoder.Decode(&greetings)    if err != nil {        panic(err)    }    for _, g := range greetings.Greetings {        fmt.Printf("%s, to %s from %s.\n", g.Greeting, g.To, g.From)    }    relationShip := &RelationShip{Messages: greetings.Greetings}    r, err := json.Marshal(&relationShip)    if err != nil {        panic(err)    }    fmt.Println(string(r))}这是一个示例 curl 请求curl -d '{"data": [{"to":"drew","from":"jo","greeting":"Hey"}, \  {"to":"lori", "from":"yuri","greeting":"what up?"}]}' \  http://localhost:3000我想也许我可以摆脱类似的事情:relationShip := &RelationShip{Messages: greetings.Greetings}但是我不能使用 []Greeting 类型作为 []Message 类型。我对 Go 和静态类型语言非常陌生。我是否遍历问候列表并将它们作为新消息项推送到消息中?要点:我正在编写一个可以接受传入请求的 API,并将其发送到正确的第三方 API,该 API 将始终关心相同的数据,但可能具有不同的密钥。因此,对实际问题和/或更好方法的提示表示赞赏和欢迎:)
查看完整描述

2 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

正如您所注意到的,您不能将 []Greeting 类型用作 []Message 类型。因为它们不是同一类型。但是,有一种方法可以从一种类型转换为另一种类型,但它需要相同的类型。


例如,以下将起作用:


type Message struct {

    From string    `json:"from"`

    To string      `json:"to"`

    Message string `json:"message"`

}


type Greeting struct {

    From string    `json:"from"`

    To string      `json:"to"`

    Message string `json:"message"`

}


func main() {

    mess := Message{"from", "to", "message"}

    fmt.Println(reflect.TypeOf(mess))

    // > Message

    greet := Greeting(mess)

    fmt.Println(reflect.TypeOf(greet))

    // > Greeting

}

但是,它要求字段相同,并且 json 标签也是如此。


在您的情况下,遍历问候并将它们转换为消息将毫无问题地工作。


查看完整回答
反对 回复 2022-01-10
?
慕桂英546537

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

根据姜 YD的评论,我替换了


relationShip := &RelationShip{Messages: greetings.Greetings}

具有以下内容:


var relationShip RelationShip

for _, g := range greetings.Greetings {

    relationShip.Messages = append(

        relationShip.Messages, Message{

            To: g.To, From: g.From, Message: g.Greeting,

        },

    )

}

哪个做我想做的事。感谢您的反馈!


查看完整回答
反对 回复 2022-01-10
  • 2 回答
  • 0 关注
  • 161 浏览
慕课专栏
更多

添加回答

举报

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