首页 > 解决方案 > 匹配具有不同结构的两个数组

问题描述

我有以下

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 的答案,然后只将一个答案送到前面。

标签: jsongo

解决方案


如果你想偷懒:将它们解组为通用类型 map[string]interface{} 的数组,而不是 Book 类型。

var books []map[string]interface{}
err := json.Unmarshal(response, &books)

当然,这使得访问具体的书籍属性变得更加困难,但这并非不可能。


推荐阅读