Golang JSON结构到小写不';行不通

Golang JSON结构到小写不';行不通,json,go,Json,Go,我有一个结构: type Credentials struct { Username string `json:"username"` Password string `json:"password"` ApplicationId string `json:"application_id"` ApplicationKey string `json:"application_key"` } 我已经将字段标记为小写 但是,每当我包含应用程序

我有一个结构:

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' 
}
但是如果我删除了其中一个标记(因此删除
applicationId
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\u id
application\u key
都是空字符串。但是,如果我删除了相应的标记,那么该字段将被张贴

看起来您的凭证文件是错误的(它需要使用密钥应用程序\u id和应用程序\u key-Go足够聪明,可以计算出大小写,但不需要下划线):


看起来您的凭证文件是错误的(它需要使用密钥应用程序\u id和应用程序\u key-Go足够智能,可以计算出大小写,但不能使用下划线):


根据示例文件,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"
}
您也可以从另一端处理此问题,并修改文件中的条目,使其看起来像这样

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

中产生错误,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"
}
您也可以从另一端处理此问题,并修改文件中的条目,使其看起来像这样

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之类的东西,它将分配近似匹配项,但这里的情况并非如此。任何不完全匹配的内容都会导致
解组错误

请给出一个最小的示例来重现problem@JimB,我刚刚更新了我的问题您的文件没有密钥:
application\u id
application\u key
请显示一个最小的示例来重现problem@JimB,我刚刚更新了我的问题您的文件没有密钥:
application\u id
application\u key