首页 > 后端开发 > Golang > 正文

如何在 Go 中解析转义的 JSON 字符串

霞舞
发布: 2025-10-13 12:58:41
原创
885人浏览过

如何在 go 中解析转义的 json 字符串

本文介绍了在 Go 语言中使用 `strconv.Unquote` 函数解析转义 JSON 字符串的方法。当通过 Sockjs 等方式接收到的 JSON 数据被转义成字符串时,直接使用 `json.Unmarshal` 会失败。本文将提供一个完整的示例代码,展示如何正确地将转义后的 JSON 字符串解析为 Go 结构体。

在 Go 语言中,处理 JSON 数据是一项常见的任务。encoding/json 包提供了强大的序列化和反序列化功能。然而,在某些情况下,例如通过 WebSocket 或 Sockjs 接收到的 JSON 数据,可能会被转义成字符串,导致直接使用 json.Unmarshal 函数解析时出现 json: cannot unmarshal string into Go value of type ... 错误。

这是因为 json.Unmarshal 期望接收的是原始的 JSON 数据,而不是经过转义的字符串。为了解决这个问题,我们需要先将转义后的字符串还原成原始的 JSON 格式,然后再进行解析。

Go 语言的 strconv 包提供了一个 Unquote 函数,专门用于去除字符串的引号和转义字符。我们可以利用这个函数来解决上述问题。

以下是一个完整的示例代码,演示了如何使用 strconv.Unquote 函数解析转义的 JSON 字符串:

package main

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

type Msg struct {
    Channel string `json:"channel"`
    Name    string `json:"name"`
    Msg     string `json:"msg"`
}

func main() {
    var msg Msg
    var val []byte = []byte(`"{\"channel\":\"buu\",\"name\":\"john\", \"msg\":\"doe\"}"`)

    s, err := strconv.Unquote(string(val))
    if err != nil {
        fmt.Println("Error unquoting string:", err)
        return
    }

    err = json.Unmarshal([]byte(s), &msg)
    if err != nil {
        fmt.Println("Error unmarshaling JSON:", err)
        return
    }

    fmt.Println("Unquoted string:", s)
    fmt.Println("Parsed message:", msg)
    fmt.Println("Channel:", msg.Channel, "Name:", msg.Name, "Msg:", msg.Msg)
}
登录后复制

代码解释:

Find JSON Path Online
Find JSON Path Online

Easily find JSON paths within JSON objects using our intuitive Json Path Finder

Find JSON Path Online 30
查看详情 Find JSON Path Online
  1. 定义结构体: 首先,我们定义了一个 Msg 结构体,用于存储 JSON 数据中的 channel、name 和 msg 字段。注意,这里使用了 json tag 来指定 JSON 字段名,确保反序列化时能正确映射。
  2. 模拟转义的 JSON 字符串: 我们创建了一个 []byte 类型的变量 val,模拟从网络接收到的转义 JSON 字符串。
  3. 使用 strconv.Unquote 函数: strconv.Unquote(string(val)) 函数用于去除字符串的引号和转义字符。如果 Unquote 函数执行失败,会返回一个错误,我们需要进行处理。
  4. 使用 json.Unmarshal 函数: json.Unmarshal([]byte(s), &msg) 函数将原始 JSON 数据反序列化到 Msg 结构体中。如果反序列化失败,也会返回一个错误,同样需要进行处理。
  5. 打印结果: 最后,我们打印出未转义的字符串和解析后的结构体内容,以验证解析是否成功。

运行结果:

Unquoted string: {"channel":"buu","name":"john", "msg":"doe"}
Parsed message: {buu john doe}
Channel: buu Name: john Msg: doe
登录后复制

注意事项:

  • 确保正确处理 strconv.Unquote 和 json.Unmarshal 函数返回的错误。
  • 如果 JSON 字符串的格式不正确,json.Unmarshal 函数可能会返回错误。
  • strconv.Unquote 函数只能去除一层引号和转义字符。如果 JSON 字符串被多次转义,需要多次调用 strconv.Unquote 函数。
  • 在实际应用中,val 变量应该从网络连接中读取数据,而不是硬编码

总结:

通过使用 strconv.Unquote 函数,我们可以轻松地解析转义的 JSON 字符串,并将其反序列化到 Go 结构体中。这种方法在处理通过 WebSocket 或 Sockjs 等方式接收到的 JSON 数据时非常有用。记住,在处理任何外部数据时,都需要进行错误处理,以确保程序的健壮性。

以上就是如何在 Go 中解析转义的 JSON 字符串的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号