我的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), ¶msIn)
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请求正文中使用了正确的双引号字符,上面的代码就没有问题了。
如果我不清楚,请评论,我可以澄清更多。