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

时间:2018-11-07 09:01:49

标签: json string go unmarshalling

我有以下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 
}

我尝试了几种不同的方式来实现strings.Split()的自定义解组,但是到目前为止还没有成功。

在解组过程中有什么方法可以实现这一目标?还是我需要直接解组并事后进行转换?

1 个答案:

答案 0 :(得分:7)

最简单的方法是定义自己的字符串切片类型,并在其上实现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>