Golang解析带连字符的JSON键

Golang解析带连字符的JSON键 我尝试使用json包解码以下包含连字符/破折号的JSON:

{ "user-name": "ram"}

我定义的结构体如下:

type user struct {
Username string `json:"user-name"`
}

令人惊讶的是,它无法解码该值。这背后的原因是什么?在Go中,我该如何将其解码到结构体并访问该值?因为这是第三方遗留格式,我无法更改。

3 回复

感谢您的快速回复。

更多关于Golang解析带连字符的JSON键的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


能否请使用playground来提供一个示例?

据我所知,这个方法对我有效…


编辑

看起来在两个方向上都有效:

https://play.golang.org/p/BJECXoRU59V

在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
}

如果问题仍然存在,请检查以下方面:

  1. 确保JSON数据格式正确(例如,无额外逗号或引号问题)。
  2. 验证结构体标签中使用的引号类型:必须是反引号(` `),而不是单引号(’ ')或双引号(" ")。
  3. 如果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键。如果问题持续,请提供具体的错误信息以便进一步诊断。

回到顶部