You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Django DateTime序列化为JSON并在Golang服务中正确解析

解决Django与Golang间DateTime序列化/解析的问题

看起来你遇到的核心问题是Django端DateTime字段的序列化格式不标准,导致Golang的null.Time无法正确解析,最终得到零值时间。下面分步骤解决:

第一步:修正Django端的DateTime序列化逻辑

你的toJson()方法里用str(self.created)来转换时间,这会产生两个关键问题:

  • 当时间字段为null时,str(null)会得到字符串"None",而非JSON标准的null,Golang的null.Time无法识别这个字符串,会默认解析为零值
  • 非空时,str(datetime)输出的格式(比如"2024-05-20 14:30:00+00:00")不是Golang默认支持的RFC3339/ISO8601标准格式,解析容易失败

修改toJson()方法,改用isoformat()生成标准ISO8601格式字符串,空值直接返回None(requests.post的json参数会自动把None序列化为JSONnull):

def toJson(self):
    ret = {}
    # 非空时输出ISO8601格式,空值返回None对应JSON null
    ret["Created"] = self.created.isoformat() if self.created else None
    ret["Modified"] = self.modified.isoformat() if self.modified else None
    ret["Used"] = self.used
    ret["Raw"] = self.raw
    return ret

另外注意你的save()方法里有个笔误:super(DataLbc, self).save(...)应该改为super(Data, self).save(...),否则模型保存时会报错:

def save(self, *args, **kwargs):
    """ On save, update timestamps """
    if not self.uuid :
        self.uuid = str(uuid.uuid4().hex) +str(random.randint(1000,9999) )
    if not self.id:
        self.created = timezone.now()
        self.modified = timezone.now()
    # 修正super的参数,模型类是Data
    return super(Data, self).save(*args, **kwargs)

第二步:确保Golang端正确解析

你的Golang结构体定义是正确的,null.Time(来自gopkg.in/guregu/null.v3)默认支持解析ISO8601/RFC3339格式的时间字符串,也能正确识别JSONnull(此时null.Time的Valid字段为false,时间值为零值)。

如果还是有问题,可以在convertLbc函数里先打印请求体,确认收到的JSON格式是否正确:

import (
    // 新增这两个包
    "bytes"
    "io"
    "io/ioutil"
)

func convertLbc(c *gin.Context) {
    // 先打印请求体,排查JSON格式
    body, err := io.ReadAll(c.Request.Body)
    if err != nil {
        fmt.Println("read body error:", err)
        return
    }
    fmt.Println("Received JSON:", string(body))
    // 把body放回,因为BindJSON会读取一次
    c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(body))

    var rawOffer RawOffer
    if err := c.BindJSON(&rawOffer); err != nil {
        fmt.Println("bind json error:", err)
        return
    }
    fmt.Println("Parsed Created:", rawOffer.Created)
    fmt.Println("Created is valid:", rawOffer.Created.Valid)
    // ... 后续逻辑
}

验证效果

修改后,Django发送的JSON会是类似这样的格式:

{
    "Created": "2024-05-20T14:30:00.123456+00:00",
    "Modified": null,
    "Used": false,
    "Raw": "your raw data"
}

Golang端解析后:

  • 当Created有值时,rawOffer.Created.Valid为true,时间值正确
  • 当Modified为null时,rawOffer.Modified.Valid为false,符合预期

内容的提问来源于stack exchange,提问作者Bussiere

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:34:33