首页 > 后端开发 > Golang > 如何在 Go 中高效解析 JSON,无需冗余解组?

如何在 Go 中高效解析 JSON,无需冗余解组?

Susan Sarandon
发布: 2024-12-29 11:27:10
原创
473 人浏览过

How Can I Efficiently Parse JSON in Go Without Redundant Unmarshaling?

在 Go 中解析 JSON,无需冗余解组

处理包含不同类型数据的 JSON 消息时,常见的方法可能涉及将数据解组到通用映射中[ string]interface{} 检查键并尝试将值转换为特定结构。然而,这种方法可能会导致不必要的双重解组。

在 Go 上下文中,有一种更有效的解决方案可以将 JSON 数据部分解组到 json.RawMessage 而不是 interface{}。这是通过将映射声明为:

var myMap map[string]json.RawMessage
登录后复制

当将值转换为特定结构时,可以消除编组/解组步骤。例如,在您的情况下,您使用以下方法强制转换为“Ack”结构:

ackjson, err := json.Marshal(v)
if err != nil {
    fmt.Println("marshal error: ", err)
}
err = json.Unmarshal(ackjson, &myAck)
if err != nil {
    fmt.Println("unmarshal error", err)
}
登录后复制

相反,它可以简化为:

err = json.Unmarshal(v, &myAck)
登录后复制

这种方法避免了冗余的解组步骤,使解析更加高效。

这是包含此代码的更新版本优化:

package main

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)
    }
    for k, v := range myMap {
        fmt.Printf("key: %s, value: %s \n", k, v)

        switch k {
        case "ping":
            fmt.Println(k, " is a ping", v)
        case "ack":
            fmt.Println(k, " is an ack containing a message list")
            err = json.Unmarshal(v, &myAck)
            if err != nil {
                fmt.Println("unmarshal error", err)
            } else {
                fmt.Println("New ack object: ", myAck)
            }
        default:
            fmt.Printf("%s is of a type (%T) I don't know how to handle", k, v)
        }
    }
}
登录后复制

通过利用 json.RawMessage 并消除不必要的解组,您可以在不影响功能的情况下提高 JSON 解析的性能。

以上是如何在 Go 中高效解析 JSON,无需冗余解组?的详细内容。更多信息请关注PHP中文网其他相关文章!

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