首页 > 后端开发 > Golang > 在 Go 中解析 JSON 时如何避免双重解组?

在 Go 中解析 JSON 时如何避免双重解组?

Mary-Kate Olsen
发布: 2024-12-30 07:07:09
原创
1022 人浏览过

How to Avoid Double Unmarshaling When Parsing JSON in Go?

在 Go 中解组 JSON,无需双重解组

在 Go 中,可能会遇到需要将 JSON 解析为各种结构的情况,但会发生双重解组,导致冗余。本文提出了一种解决方案,涉及部分解组数据以避免第二个解组步骤。

理解问题

当尝试将 JSON 解析为已知结构时,一个常见的问题是方法是:

  1. 将 JSON 解组为泛型map[string]interface{}
  2. 查找期望的键
  3. 尝试将值转换为所需的类型
  4. 如果转换失败,将值编组为 JSON 并将其解组到所需的类型(双重解组)

解决方案

我们可以将其解组为 json.RawMessage,而不是将值强制转换为 interface{}。这会部分解组数据,并允许随后根据键值解组到特定结构。

示例代码

import (
    "encoding/json"
    "fmt"
)

type Ping struct {
    Ping string `json:"ping"`
}

type Ack struct {
    Messages []Message `json:"messages"`
}

type Message string

func main() {
    testJSON := []byte(`{"ack":{"messages":["Hi there","Hi again"]}}`)
    var myAck = Ack{}
    var myMap map[string]json.RawMessage

    err := json.Unmarshal(testJSON, &myMap)
    if err != nil {
        fmt.Println("error unmarshalling: ", err)
    }

    jsonAck, ok := myMap["ack"]
    if !ok {
        fmt.Println("key 'ack' not found")
        return
    }

    err = json.Unmarshal(jsonAck, &myAck)
    if err != nil {
        fmt.Println("unmarshal error", err)
    } else {
        fmt.Println("New ack object: ", myAck)
    }
}
登录后复制

在此修改后的代码中,我们替换了映射[string]interface{} 与 map[string]json.RawMessage。处理“ack”键时,我们直接解组到 Ack 结构,从而无需双重解组。

以上是在 Go 中解析 JSON 时如何避免双重解组?的详细内容。更多信息请关注PHP中文网其他相关文章!

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