首页 > 后端开发 > Golang > 如何在 Go 中对未编组的 JSON 数据执行类型断言?

如何在 Go 中对未编组的 JSON 数据执行类型断言?

Susan Sarandon
发布: 2024-12-25 09:28:28
原创
940 人浏览过

How to Perform Type Assertions on Unmarshaled JSON Data in Go?

带有未编组数据的类型断言

在分布式系统中,数据通常作为 JSON 字符串进行交换。从消息队列中检索 JSON 数据时,您可能会遇到需要将数据反序列化为 Interface{},然后执行类型断言以确定数据实际结构类型的场景。

问题

将接收到的 JSON 字符串解组到接口{}并尝试输入断言结果时,您可能会遇到意外结果。您获得的不是预期的结构类型,而是映射[字符串]接口{}。

解决方案

JSON 解组到接口{} 的默认行为会产生类型例如 bool、float64、string、[]interface{} 和 map[string]interface{}。由于 Something1 和 Something2 是自定义结构,因此 JSON 解组器无法识别它们。

要解决此问题,有两种主要方法:

1。直接解组到自定义结构

代码:

var input Something1
json.Unmarshal([]byte(msg), &input)
// Type assertions and processing can be performed here

var input Something2
json.Unmarshal([]byte(msg), &input)
// Type assertions and processing can be performed here
登录后复制

2.从地图界面解压

代码:

var input interface{}
json.Unmarshal([]byte(msg), &input)

// Unpack the data from the map
switch v := input.(type) {
case map[string]interface{}:
    // Extract the data from the map and assign it to custom structs
}
登录后复制

高级方法

要获得更通用的解决方案,考虑创建一个“Unpacker”结构来处理解组和类型断言

代码:

type Unpacker struct {
    Data       interface{}
}

func (u *Unpacker) UnmarshalJSON(b []byte) error {
    smth1 := &Something1{}
    err := json.Unmarshal(b, smth1)
    if err == nil && smth1.Thing != "" {
        u.Data = smth1
        return nil
    }

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

    u.Data = smth2
    return nil
}
登录后复制

结论

通过使用其中一种方法,您可以成功执行 type对首先从 JSON 字符串解组到接口{}的数据的断言。方法的选择取决于您应用程序的具体要求。

以上是如何在 Go 中对未编组的 JSON 数据执行类型断言?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板