gpt4 book ai didi

json - 在不使用临时结构的情况下实现 Unmarshaller

转载 作者:IT王子 更新时间:2023-10-29 02:37:06 27 4
gpt4 key购买 nike

下面有一个 Unmarshaller 实现,因为 time.Unix 只接受秒或纳秒,但我的数据源以毫秒为单位。在问我这里的问题之前是一些代码

代码:

type Platform struct {
Status CampaignStatus `json:"status" bson:"status"`
TotalBudget int `json:"total_budget" bson:"totalBudget"`
RemainingBudget int `json:"remaining_budget" bson:"remainingBudget"`
MillisecondsStartDate int64 `json:"start_date"`
StartDate time.Time `bson:"startDate"`
MillisecondsEndDate int64 `json:"end_date"`
EndDate time.Time `bson:"endDate"`
Audiance Audiance `json:"target_audiance" bson:"targetAudiance"` //typo?
Creatives Creatives `json:"creatives" bson:"Creatives"`
Insights Insights `json:"insights" bson:"insights"`
}

func (p *Platform) UnmarshalJSON(b []byte) (err error) {

p2 := struct {
Status CampaignStatus `json:"status" bson:"status"`
TotalBudget int `json:"total_budget" bson:"totalBudget"`
RemainingBudget int `json:"remaining_budget" bson:"remainingBudget"`
MillisecondsStartDate int64 `json:"start_date"`
StartDate time.Time `bson:"startDate"`
MillisecondsEndDate int64 `json:"end_date"`
EndDate time.Time `bson:"endDate"`
Audiance Audiance `json:"target_audiance" bson:"targetAudiance"` //typo?
Creatives Creatives `json:"creatives" bson:"Creatives"`
Insights Insights `json:"insights" bson:"insights"`
}{}

err = json.Unmarshal(b, &p2)
if err != nil {
return
}

p2.StartDate = time.Unix(0, p2.MillisecondsStartDate*int64(time.Millisecond/time.Nanosecond))
p2.EndDate = time.Unix(0, p2.MillisecondsEndDate*int64(time.Nanosecond/time.Microsecond))

*p = p2

return
}

我的问题是

  1. 在这种情况下,有没有一种方法可以在不创建中间结构的情况下实现 Unmarshaller?如您所见,如果我使用平台类型 isstead of middle struct,我会收到堆栈溢出错误。
  2. 这种方法会导致内存泄漏吗?

最佳答案

您可以将编码器可以处理的字段作为 Platform 结构中的匿名结构进行组合,例如:

type platformInner struct {
Status CampaignStatus `json:"status" bson:"status"`
TotalBudget int `json:"total_budget" bson:"totalBudget"`
RemainingBudget int `json:"remaining_budget" bson:"remainingBudget"`
MillisecondsStartDate int64 `json:"start_date"`

MillisecondsEndDate int64 `json:"end_date"`

Audiance Audiance `json:"target_audiance" bson:"targetAudiance"` //typo?
Creatives Creatives `json:"creatives" bson:"Creatives"`
Insights Insights `json:"insights" bson:"insights"`
}

type Platform struct {
platformInner
StartDate time.Time `bson:"startDate"`
EndDate time.Time `bson:"endDate"`
}

然后在自定义解码器中,解码到嵌套结构中,并设置其他值。

func (p *Platform) UnmarshalJSON(b []byte) (err error) {
var inner platformInner
err = json.Unmarshal(b, &inner)
if err != nil {
return
}

tmp := &Platform{
innerPlatform: inner,
StartDate: time.Unix(0, inner.MillisecondsStartDate*int64(time.Millisecond/time.Nanosecond))
EndDate: time.Unix(0, inner.MillisecondsEndDate*int64(time.Nanosecond/time.Microsecond))
}

*p = tmp

return
}

关于json - 在不使用临时结构的情况下实现 Unmarshaller,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51802518/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com