Golang JSON结构为小写不起作用

时间:2016-03-25 17:25:47

标签: json go

我有一个结构:

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

但是,如果我删除了其中一个代码(请删除ApplicatinonIdApplicationKey代码),那么该字段会显示

以下是我设置结构的方法:

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_idapplication_key都作为空字符串。但是,如果我删除相应的标签,则会发布该字段

2 个答案:

答案 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的错误。