如何将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
相关产品推荐
相关产品推荐

