无法在Go中将JSON字符串解组为结构



我的Go模块中有一个字符串,它是HTTP响应的主体。它看起来像这样:

bodyString = `{"firstname": "foo", "lastname": "bar", "username": "foobar"}`

我想将其转换为以下Go结构:

type Params struct {
FirstName string
LastName string
Username string
PasswordHash string 
EmailAddress string
}

我尝试使用以下方法:

var jsonMap map[string]interface{}
json.Unmarshal([]byte(bodyString), &jsonMap)
paramsIn.FirstName = jsonMap["firstname"].(string)
paramsIn.LastName = jsonMap["lastname"].(string)
paramsIn.Username = jsonMap["username"].(string)
paramsIn.PasswordHash = jsonMap["passwordhash"].(string)
paramsIn.EmailAddress = jsonMap["emailaddress"].(string)

但是,解组无法将字符串中的数据与适当的键相匹配。即存储在jsonMap变量中的只是空字符串。

我显然做错了什么,而且我在Go中没有太多使用json。如果有人能帮助我或向我展示从字符串中解组json数据的正确方法,那就太好了,谢谢。

Golang会将结构的字段名(CammelCase(转换为snake_case(默认值(。所以,如果你有这样的结构:

type Params struct {
FirstName string
LastName string
Username string
PasswordHash string 
EmailAddress string
}

结构中的JSON将是:

{
"first_name":"bla",
"last_name":"bla",
"user_name":"bla",
"password_hash":"ewedsads",
"email_address":"bla@gmail.com"
}

但是您可以通过json标签自定义JSON字段名称,例如:

type Params struct {
FirstName string `json:"firstname"`
LastName string `json:"lastname"`
Username string `json:"username"`
PasswordHash string `json:"passwordhash"`
EmailAddress string `json:"emailaddress"`
}

然后你可以这样更改你的代码:

package main
import (
"encoding/json"
"fmt"
)
type Params struct {
FirstName    string `json:"firstname"`
LastName     string `json:"lastname"`
Username     string `json:"username"`
PasswordHash string `json:"passwordhash"`
EmailAddress string `json:"emailaddress"`
}
func main() {
paramsIn := Params{}
bodyString := `{"firstname": "foo", "lastname": "bar", "username": "foobar"}`
json.Unmarshal([]byte(bodyString), &paramsIn)
fmt.Println(paramsIn)
}

使用这样的go标签:

type Params struct {
FirstName    string `json:"firstname"`
LastName     string `json:"lastname"`
Username     string `json:"username"`
PasswordHash string
EmailAddress string
}

这可能不是每个经历过这个问题的人的解决方案,你应该在这篇文章和其他类似的SO文章中查看其他答案。

对我来说,问题是如何处理双引号字符("(。我的json字符串是从http响应的主体创建的,该响应由另一个终端窗口中的curl命令提供。我在MacOS的标准文本编辑器中编写curl命令,但我使用的是RTF(Rich text Format(,它将我的"字符格式化为其他字符(((差异很小,但足以让我花上几个小时!(。一旦我在http请求正文中使用了正确的双引号字符,上面的代码就没有问题了。

如果我不清楚,请评论,我可以澄清更多。

最新更新