3 回答
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
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”)
- 3 回答
- 0 关注
- 148 浏览
添加回答
举报