在Golang中使用字符串拆分的自定义解组

I have the following JSON

{"student_number":1234567, "name":"John Doe", "subjects":"Chemistry-Maths-History-Geography"}

I would like to unmarshal it in a struct, where one item (the subjects) are split on '-' into a []string.

type Student struct {
  StudentNumber int       `json:"student_number"`
  Name          string    `json:"name"`
  Subjects []string 
}

I have attempted several different ways of achieving this with custom Unmarshalling using strings.Split(), but have not succeeded so far.

Is there any way to achieve this in the unmarshalling process? Or will I need to simply unmarshal as is and make the conversion afterward?

Easiest would be to define your own string slice type and implement json.Unmarshaler on that:

type strslice []string

func (ss *strslice) UnmarshalJSON(data []byte) error {
    var s string
    if err := json.Unmarshal(data, &s); err != nil {
        return err
    }
    *ss = strings.Split(s, "-")
    return nil
}

And use this in your struct:

type Student struct {
    StudentNumber int      `json:"student_number"`
    Name          string   `json:"name"`
    Subjects      strslice `json:"subjects"`
}

And then it'll work:

func main() {
    var s Student
    err := json.Unmarshal([]byte(src), &s)
    fmt.Println(s, err)
}

const src = `{"student_number":1234567, "name":"John Doe", "subjects":"Chemistry-Maths-History-Geography"}`

Output (try it on the Go Playground):

{1234567 John Doe [Chemistry Maths History Geography]} <nil>