golang 反序列化问题,不能把 string 反序列化成其他类型

今天写代码排查问题时发现了一个问题,我想把下面这个json字符串反序列到一个对象中,所以我定义了一个 struct

{
    "name": 42,
    "age": 2,
    "extra": "{\"city\": \"北京\"}"
}

struct 的定义如下:

type Student struct {
	Name  string                 `json:"name"`
	Age   int                    `json:"age"`
	Extra map[string]interface{} `json:"extra"`
}

实际程序运行时,提示了 反序列化错误,exra 字段不能将字符串类型反序列成 map[string]interface{} 类型。我还有有点纳闷,extra 字段反序列化后可不就是是个map吗,怎么会报错呢,后来意识到 extra 字段的内容被双引号扩起来了,我在对整个字符串进行反序列化时,extra 字段因为值内容被双引号包围,实际反序列化时肯定会被当做字符串,如果单独再对 extra 字段进行一次反序列化,那就用可以用 map[string]interface{} 类型来接收了。

后来发现只有当 extra 字段是个字典类型时,才能被反序列化成一个 map[string]interface{} 类型。总之就是不能被双引号包围,否则就会被当做是字符串。

{
    "name": 42,
    "age": 2,
    "extra": {
        "city": "北京"
    }
}
  • 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、付费专栏及课程。

余额充值