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

使用 Go,我想接受一个带有 json 数据的请求,并将其转换为不同的结构以用于传出的 json 请求。


这是我的意思的一个例子:


package main


import (

    "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 将始终关心相同的数据,但可能具有不同的密钥。因此,对实际问题和/或更好方法的提示表示赞赏和欢迎:)


holdtom
浏览 162回答 2
2回答

汪汪一只猫

正如您所注意到的,您不能将 []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 标签也是如此。在您的情况下,遍历问候并将它们转换为消息将毫无问题地工作。

慕桂英546537

根据姜 YD的评论,我替换了relationShip := &RelationShip{Messages: greetings.Greetings}具有以下内容:var relationShip RelationShipfor _, g := range greetings.Greetings {    relationShip.Messages = append(        relationShip.Messages, Message{            To: g.To, From: g.From, Message: g.Greeting,        },    )}哪个做我想做的事。感谢您的反馈!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go