Golang解析带连字符的JSON键
Golang解析带连字符的JSON键 我尝试使用json包解码以下包含连字符/破折号的JSON:
{ "user-name": "ram"}
我定义的结构体如下:
type user struct {
Username string `json:"user-name"`
}
令人惊讶的是,它无法解码该值。这背后的原因是什么?在Go中,我该如何将其解码到结构体并访问该值?因为这是第三方遗留格式,我无法更改。
3 回复
在Go语言中,当JSON键包含连字符(如"user-name")时,标准库的encoding/json包默认无法直接映射到结构体字段,因为Go的字段名必须遵循标识符命名规则(不能包含连字符)。不过,可以通过结构体标签(struct tag)正确指定JSON键名来解决这个问题。
在你的示例中,结构体定义是正确的,但需要确保使用的是反引号(backtick)而非单引号。以下是修正后的代码示例:
package main
import (
"encoding/json"
"fmt"
)
type user struct {
Username string `json:"user-name"` // 使用反引号定义标签
}
func main() {
jsonData := `{ "user-name": "ram" }`
var u user
err := json.Unmarshal([]byte(jsonData), &u)
if err != nil {
fmt.Println("解码错误:", err)
return
}
fmt.Printf("用户名: %s\n", u.Username) // 输出: 用户名: ram
}
如果问题仍然存在,请检查以下方面:
- 确保JSON数据格式正确(例如,无额外逗号或引号问题)。
- 验证结构体标签中使用的引号类型:必须是反引号(` `),而不是单引号(’ ')或双引号(" ")。
- 如果JSON键是动态的或结构体无法预定义,可以使用
map[string]interface{}进行通用解码:
var data map[string]interface{}
err := json.Unmarshal([]byte(jsonData), &data)
if err != nil {
fmt.Println("解码错误:", err)
return
}
fmt.Println("用户名:", data["user-name"]) // 输出: ram
以上方法应能正确解码带连字符的JSON键。如果问题持续,请提供具体的错误信息以便进一步诊断。

