json.Unmarshal convert to custom another type(Map到切片)

hs1ihplo  于 2023-05-19  发布在  其他
关注(0)|答案(1)|浏览(173)

给定以下JSON字符串:

{
 "username":"bob",
 "name":"Robert",
 "locations": [
   {
    "city": "Paris",
    "country": "France"
   },
   {
    "city": "Los Angeles",
    "country": "US"
   }
 ]
}

我需要一种方法来将其解封到结构体中,如下所示:

type User struct {
 Username string
 Name string
 Cities []string
}

其中Cities是包含“城市”值的切片,“国家”被丢弃。
我认为这可以使用自定义的JSON.Unmarshal函数来完成,但不确定如何做到这一点。

h79rfbju

h79rfbju1#

您可以为Cities定义新类型并实现自定义Unmarshaler:

type User struct {
    Username string   `json:"username"`
    Name     string   `json:"name"`
    Cities   []Cities `json:"locations"`
}

type Cities string

func (c *Cities) UnmarshalJSON(data []byte) error {
    tmp := struct {
        City string `json:"city"`
    }{}
    err := json.Unmarshal(data, &tmp)
    if err != nil {
        return err
    }
    *c = Cities(tmp.City)
    return nil
}

PLAYGROUND

相关问题