我有两个具有以下结构的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结构。但是我不能为相同的struct元素提供两个名称标签(广播和电影)。我想要类似的东西
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。
提前致谢。
您可以使用type Info map[string][]Detail而不是您的结构。试一下[Go playground](https://play.golang.org/p/P-Ge6wjXRk)
type Info map[string][]Detail
[Go playground](https://play.golang.org/p/P-Ge6wjXRk)
或者,您可以在结构中使用这两种类型,然后使用make方法Details()返回正确的一种:
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](https://play.golang.org/p/eYf7c-w_4e)
[Go playground](https://play.golang.org/p/eYf7c-w_4e)