
本文介绍了在 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)
}代码解释:
Easily find JSON paths within JSON objects using our intuitive Json Path Finder
30
运行结果:
Unquoted string: {"channel":"buu","name":"john", "msg":"doe"}
Parsed message: {buu john doe}
Channel: buu Name: john Msg: doe注意事项:
总结:
通过使用 strconv.Unquote 函数,我们可以轻松地解析转义的 JSON 字符串,并将其反序列化到 Go 结构体中。这种方法在处理通过 WebSocket 或 Sockjs 等方式接收到的 JSON 数据时非常有用。记住,在处理任何外部数据时,都需要进行错误处理,以确保程序的健壮性。
以上就是如何在 Go 中解析转义的 JSON 字符串的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号