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

如何将具有相同内部结构的两个 json 解组为一个 golang 结构?

如何将具有相同内部结构的两个 json 解组为一个 golang 结构?

Go
沧海一幻觉 2021-10-25 18:23:11
我有两个具有以下结构的 json 文件{ "cast": [        {            "url": "carey-mulligan",            "name": "Carey Mulligan",            "role": "Actress"        },        {            "url": "leonardo-dicaprio",            "name": "Leonardo DiCaprio",            "role": "Actor"        },        .        .        .         ]}和{ "movie": [        {            "url": "carey-mulligan",            "name": "Carey Mulligan",            "role": "Actress"        },        {            "url": "leonardo-dicaprio",            "name": "Leonardo DiCaprio",            "role": "Actor"        },        .        .        .         ]}如您所见,演员和电影的 json 内部结构相同。我想将这些 json 文件解组到相同的 golang 结构中。但我无法为同一个结构元素提供两个名称标签(演员和电影)。我想要类似的东西type Detail struct {    Name string `json:"name"`    Url  string `json:"url"`    Role string `json:"role"`}type Info struct {    Detail []Detail `json:"cast or movie"`}在这种情况下,Detail 可以解析演员表和电影。这是我当前的代码// RIMAGE project main.gopackage mainimport (    "encoding/json"    "fmt"    "io/ioutil")const (    website = "https://data.moviebuff.com/")func main() {    fmt.Println("Hello World!")    content, err := ioutil.ReadFile("data/great-getsby")    if err != nil {        panic(err)    }    var info Info    err = json.Unmarshal(content, &info)    if err != nil {        panic(err)    }    fmt.Println(info.Detail)}type Detail struct {    Name string `json:"name"`    Url  string `json:"url"`    Role string `json:"role"`}type Info struct {    Detail []Detail `json:"cast" json:"movie"}但它只适用于第一个标签“cast”,并且在 json 包含电影的情况下给出 nill。提前致谢。
查看完整描述

3 回答

?
www说

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

您可以使用type Info map[string][]Detail代替您的结构。试试吧Go playground


或者你可以在你的结构中使用这两种类型,并且 make 方法Details()将返回正确的一种:


type Info struct {

    CastDetails  []Detail `json:"cast"`

    MovieDetails []Detail `json:"movie"`

}


func (i Info) Details() []Detail {

    if i.CastDetails == nil {

        return i.MovieDetails

    }

    return i.CastDetails

}

试试吧 Go playground


查看完整回答
反对 回复 2021-10-25
?
元芳怎么了

TA贡献1798条经验 获得超7个赞

尝试结构中的匿名字段:


package main


import (

    "encoding/json"

    "fmt"

    "io/ioutil"

)


type Detail struct {

    Name string `json:"name"`

    Url  string `json:"url"`

    Role string `json:"role"`

}


type Cast struct {

    Detail []Detail `json:"cast"`

}


type Movie struct {

    Detail []Detail `json:"movie"`

}


type Info struct {

    Cast

    Movie

}


func (i *Info) getDetails() []Detail {

    if len(i.Cast.Detail) > 0 {

        return i.Cast.Detail

    }

    return i.Movie.Detail

}


func main() {

    cast, _ := ioutil.ReadFile("./cast.json")

    movie, _ := ioutil.ReadFile("./movie.json")


    var cInfo Info

    err := json.Unmarshal(cast, &cInfo)

    fmt.Printf("cast: %+v\n", &cInfo)

    fmt.Printf("err: %v\n", err)

    fmt.Printf("details: %v\n", cInfo.getDetails())


    var mInfo Info

    err = json.Unmarshal(movie, &mInfo)

    fmt.Printf("movie: %+v\n", &mInfo)

    fmt.Printf("err: %v\n", err)

    fmt.Printf("details: %v\n", mInfo.getDetails())

}

注意事项:


另一个间接级别:要访问“详细信息”字段,您需要首先访问“信息”中的“演员”或“电影”字段。

更好地为“详细信息”提供访问功能(本例中为“getDetail”)


查看完整回答
反对 回复 2021-10-25
  • 3 回答
  • 0 关注
  • 148 浏览
慕课专栏
更多

添加回答

举报

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