golang反序列化遇到的问题及解决方案

json同一字段多类型

  • 问题:在json中同一个字段大部分为int,少量为string类型
  • 解决方案:结构体添加json tag
type Product struct {
   
	Name      string  `json:"name"`
	ProductID int64   `json:"product_id,omitempty"` // omitempty在序列化的时候忽略0值或者空值
	Number    int     `json:"number,string"`        // 额外支持string类型
	Price     float64 `json:"price,string"`         // 额外支持string类型
	IsOnSale  bool    `json:"is_on_sale,string"`    // 额外支持string类型
}
  • 参考:https://blog.csdn.net/qq_33679504/article/details/100533703

json反序列为时间

  • 问题:
    近期在开发中,发现json中的时间类型"2022-05-19 16:09:51"通过json.Unmarshal反序列化转换为time.Time时报错
  • 解决方案:
    golang使用json自定义time类型,然后自己实现json的MarshalJSON和UnmarshalJSON方法,代码如下
package main

import (
	"encoding/json"
	"fmt"
	"time"
)

func main() {
   
	// json.Unmarshal
	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Protobuf(Protocol Buffers)是一种用于序列化结构化数据的语言无关、平台无关、可扩展的机制。它使用.proto文件定义数据结构和消息格式,并生成相应的代码用于序列化反序列化序列化原理: 1. 定义.proto文件,其中包含消息类型和字段定义。 2. 使用Protocol Buffers编译器将.proto文件编译成相应语言的代码。 3. 在代码中使用生成的类来设置消息的字段值。 4. 调用序列化方法将消息转换为字节流。 反序列化原理: 1. 接收字节流数据。 2. 调用反序列化方法解析字节流,并转换为特定语言的对象。 3. 使用对象中的字段值进行后续操作。 以下是使用Golang实现Protobuf的序列化反序列化的示例代码: ```go package main import ( "fmt" "log" "github.com/golang/protobuf/proto" ) // 定义.proto文件中的消息类型 type Person struct { Name string Age int32 Email string } func main() { // 创建Person对象 person := &Person{ Name: "Alice", Age: 25, Email: "alice@example.com", } // 序列化 data, err := proto.Marshal(person) if err != nil { log.Fatal("marshal error: ", err) } fmt.Printf("Serialized data: %v\n", data) // 反序列化 newPerson := &Person{} err = proto.Unmarshal(data, newPerson) if err != nil { log.Fatal("unmarshal error: ", err) } fmt.Printf("Deserialized data: %v\n", newPerson) } ``` 上述代码中,首先定义了一个`Person`消息类型,然后使用`proto.Marshal`方法将`person`对象序列化为字节流。接着使用`proto.Unmarshal`方法将字节流反序列化为`newPerson`对象。最后输出序列化前后的对象内容。 在使用该示例代码之前,需要通过`go get github.com/golang/protobuf/proto`命令安装Golang的Protobuf库。 希望以上信息能够对你有所帮助!如有更多问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值