2

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

所以你可以看到 Job 类型有一个 Array 类型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 解码器无法将请求正文解码ScheduleTimeCronTime.

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

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

4

1 回答 1

2

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

  1. 将 的字段重命名CronTime为大写以使其公开。
  2. CronTime实现json.Unmarshaller接口并编写一个自定义UnmarshalJSON实现来解组私有字段。
于 2013-09-16T02:35:56.877 回答