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

我有两个具有以下结构的 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.go

package main


import (

    "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。


提前致谢。


沧海一幻觉
浏览 152回答 3
3回答

www说

您可以使用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

元芳怎么了

尝试结构中的匿名字段:package mainimport (    "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”)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go