json - 匹配具有不同结构的两个数组
问题描述
我有以下
type Book struct {
Name string
Pages int
}
type Library struct {
Books []Book
}
从一个 api 我得到所有的书并像这样转换它们:
var books []Book
json.Unmarshal(response, &books)
但是现在我从另一个 api 收到另一个列表Books
,但它们具有不同的属性,这就是为什么我添加一个MetaData
属性来区分它们。
type Book struct {
Name string
Page int
Metadata MetaData
}
type MetaData struct {
Type string `json:"type"`
Price string `json:"price,omitempty"`
}
然后将两种安排合二为一,并以 json 格式返回。
books = append(response.Books, response2.Books...)
我补充omitempty
说,当它们不来时,不要在 json 中显示它们,这很好用。但是,每次我想添加一个新字段/属性时,我都必须修改我的 book api 和我上面提到的额外 api。我想知道结构是否有可能具有多个字段或接受它们,并且在它们不适用的情况下不显示它们。您必须说我无法修改相同格式的答案,并且它们都是提供者,这超出了我的能力范围。这个想法是收集 amabs 的答案,然后只将一个答案送到前面。
解决方案
如果你想偷懒:将它们解组为通用类型 map[string]interface{} 的数组,而不是 Book 类型。
var books []map[string]interface{}
err := json.Unmarshal(response, &books)
当然,这使得访问具体的书籍属性变得更加困难,但这并非不可能。