JSON解码器给出了意想不到的结果

时间:2013-09-14 20:56:40

标签: json go

我有2个结构如下

type Job struct {
    // Id            int
    ScheduleTime  []CronTime
    CallbackUrl   string
    JobDescriptor string
}

type CronTime struct {
    second     int
    minute     int
    hour       int
    dayOfMonth int
    month      int
    dayOfWeek  int
}

因此,您可以看到作业类型具有类型Crontime

的数组

我有一个帖子请求来到以下功能

func ScheduleJob(w http.ResponseWriter, r *http.Request) {
    log.Println("Schedule a Job")
    addResponseHeaders(w)
    decoder := json.NewDecoder(r.Body)
    var job *models.Job
    err := decoder.Decode(&job)
    if err != nil {
        http.Error(w, "Failed to get request Body", http.StatusBadRequest)
        return
    }
    log.Println(job)
    fmt.Fprintf(w, "Job Posted Successfully to %s", r.URL.Path)
}

我正在尝试将请求Body对象解码为Job对象

请求的JSON对象看起来像

{
    "ScheduleTime" : 
    [{
        "second" : 0,
        "minute" : 1,
        "hour" : 10,
        "dayOfMonth" : 1,
        "month" : 1,
        "dayOfWeek" : 2
    }],
    "CallbackUrl" : "SomeUrl",
    "JobDescriptor" : "SendPush"
}

但是Json解码器无法将请求Body解码为ScheduleTime CronTime的数组。

我得到{[{0 0 0 0 0 0}] SomeUrl SendPush}作为上述请求的日志输出。但我期待它{[{0 1 10 1 1 2}] SomeUrl SendPush}

有人可以告诉我,我做错了吗?

1 个答案:

答案 0 :(得分:2)

encoding/json包只会将数据解组到结构的公共字段中。所以有两种选择:

  1. CronTime的字段重命名为大写字母以使其公开。
  2. CronTime实现json.Unmarshaller接口并编写一个自定义UnmarshalJSON实现,将其解组到私有字段。