组合两个字段的自定义解组json



我有一些json,我想反编组到以下结构体

type Activity struct {
Start  time.Time `json:"start"`
End    time.Time `json:"end"`
}

如果json格式正确,可以正常工作。然而,有时候"结束"字段存在,但只是一个空字符串

{
"start": "2020-06-02T07:48:35.911Z",
"end":""
}

在本例中,我想要Activity。结束=活动。开始

我是否可以通过实现UnmarshalJSON来做到这一点,或者我是否必须使用映射?

根据mkopriva的建议:

package main
import (
"encoding/json"
"fmt"
"time"
)
type Activity struct {
Start time.Time `json:"start"`
End   time.Time `json:"end"`
}
func (a *Activity) UnmarshalJSON(data []byte) error {
var v struct {
Start time.Time
End   json.RawMessage
}
if err := json.Unmarshal(data, &v); err != nil {
return err
}
if len(v.End) > 0 && string(v.End) != `""` {
a.Start = v.Start
return json.Unmarshal([]byte(v.End), &a.End)
}

a.Start = v.Start
a.End = v.Start
return nil
}
func main() {
var data1 = []byte(`{"start": "2020-06-02T07:48:35.911Z","end":"2021-10-15T07:48:35.911Z"}`)
var data2 = []byte(`{"start": "2020-06-02T07:48:35.911Z","end":""}`)
var a Activity
if err := json.Unmarshal(data1, &a); err != nil {
panic(err)
}
fmt.Printf("%+vn", a)
if err := json.Unmarshal(data2, &a); err != nil {
panic(err)
}
fmt.Printf("%+vn", a)
}

输出:

{Start:2020-06-02 07:48:35.911 +0000 UTC End:2021-10-15 07:48:35.911 +0000 UTC}
{Start:2020-06-02 07:48:35.911 +0000 UTC End:2020-06-02 07:48:35.911 +0000 UTC}

最新更新