Таможенный Unmarshal с разделением строки в Голанге - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть следующий JSON

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

Я хотел бы разобрать его в структуре, где один элемент (субъекты) разделен на '-' на []string.

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

Я пробовал несколько разных способов добиться этого с помощью пользовательского Unmarshalling, используя strings.Split(), но пока не удалось.

Есть ли способ достичь этого в процессе демаршаллинга? Или мне нужно просто разобрать как есть и потом сделать преобразование?

1 Ответ

0 голосов
/ 07 ноября 2018

Проще всего было бы определить свой собственный тип среза строки и реализовать json.Unmarshaler для этого:

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
}

И используйте это в своей структуре:

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

И тогда это будет работать:

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"}`

Вывод (попробуйте на Go Playground ):

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