我有一个结构:
type Credentials struct {
Username string `json:"username"`
Password string `json:"password"`
ApplicationId string `json:"application_id"`
ApplicationKey string `json:"application_key"`
}
我已将我的字段标记为小写。
但是,每当我包含应用程序标签时,这些字段都会变为空,即在我的POST请求中我得到
{ application_id: '',
application_key: '',
password: 'myPassword',
username: 'myUsername'
}
但是,如果我删除了其中一个代码(请删除ApplicatinonId
或ApplicationKey
代码),那么该字段会显示
以下是我设置结构的方法:
func getCredentials() Credentials {
raw, err := ioutil.ReadFile(os.Getenv("BASE_PATH") + FILE_Credentials)
if err != nil {
log.Warn("Could not read credentials file: %s", err.Error())
os.Exit(1)
}
var credentials Credentials
json.Unmarshal(raw, &credentials)
return credentials
}
我的凭据json
文件是:
{
"Username": "myUsername",
"Password": "myPassowrd",
"ApplicationId": "someID",
"ApplicationKey": "someString"
}
然后,我发布我的数据:
credentials := getCredentials()
url := GetLoginURL()
resp, body, requestErr := gorequest.New().
Post(url).
Send(credentials).
End()
但是在服务器上,我将application_id
和application_key
都作为空字符串。但是,如果我删除相应的标签,则会发布该字段
答案 0 :(得分:2)
看起来你的凭证文件是错误的(它需要使用密钥application_id和application_key - Go足够聪明地弄清楚大小写,但不是下划线):
{
"Username": "myUsername",
"Password": "myPassowrd",
"application_id": "someID",
"application_key": "someString"
}
答案 1 :(得分:0)
根据示例文件,Go中的结构应该如下所示;
type Credentials struct {
Username string `json:"Username"`
Password string `json:"Password"`
ApplicationId string `json:"ApplicationId"`
ApplicationKey string `json:"ApplicationKey"`
}
您也可以从另一端处理此问题并修改文件中的条目,使其如下所示;
{
"Username": "myUsername",
"Password": "myPassowrd",
"application_id": "someID",
"application_key": "someString"
}
但是,更常见的情况是,您无法更改您接收的数据(例如在调用第三方API时),因此您通常最终会更改来源。由于您控制文件并且API需要小写,因此我建议您更改文件内容以匹配您发送API的内容。有时需要的另一个选项是使用另一种类型并提供转换助手(假设您既不控制文件也不控制API,则每个类型都需要不同的类型)。 Go编码包非常严格。你可能习惯于像json.NET那样分配近匹配的东西,这不是这里的情况。任何小于完全匹配的内容都会产生Unmarshal
的错误。