英文:
Go: JSON value not parsed?
问题
我有一个非常简单的测试:http://play.golang.org/p/wY4sN9AUky。配置从JSON解析,第一个字符串值解析正常,但第二个解析为空字符串,但实际上不是。
type Config struct {
Address string "address"
Debug bool "debug"
DbUrl string "dburl"
GoogleApiKey string "google_api_key"
}
func (cfg *Config) read(json_code string) {
if e := json.Unmarshal([]byte(json_code), cfg); e != nil {
log.Printf("ERROR JSON decode: %v", e)
}
}
func main() {
var config Config
config.read(`{
"address": "10.0.0.2:8080",
"debug": true,
"dburl": "localhost",
"google_api_key": "the-key"
}`)
log.Printf("api key %s", config.GoogleApiKey) // <- 空字符串。为什么?
log.Printf("address %v", config.Address)
}
英文:
I have very simple test: http://play.golang.org/p/wY4sN9AUky. Config parsed from JSON, first string value parsed OK, but second parsed to empty string, but it is not.
type Config struct {
Address string "address"
Debug bool "debug"
DbUrl string "dburl"
GoogleApiKey string "google_api_key"
}
func (cfg *Config) read(json_code string) {
if e := json.Unmarshal([]byte(json_code), cfg); e != nil {
log.Printf("ERROR JSON decode: %v", e)
}
}
func main() {
var config Config
config.read(`{
"address": "10.0.0.2:8080",
"debug": true,
"dburl": "localhost",
"google_api_key": "the-key"
}`)
log.Printf("api key %s", config.GoogleApiKey) // <- empty string. why?
log.Printf("address %v", config.Address)
}
答案1
得分: 4
你在结构体中错误地指定了JSON名称。
GoogleApiKey string "google_api_key"
应该是
GoogleApiKey string `json:"google_api_key"`
JSON包会在文本中查找json
标头。反引号用于界定原始字符串,允许我们在google_api_key
周围包含引号。
http://play.golang.org/p/KNxYhzGLAp
package main
import (
"log"
"encoding/json"
)
type Config struct {
Address string `json:"address"`
Debug bool `json:"debug"`
DbUrl string `json:"dburl"`
GoogleApiKey string `json:"google_api_key"`
}
func (cfg *Config) read(json_code string) {
if e := json.Unmarshal([]byte(json_code), cfg); e != nil {
log.Printf("ERROR JSON decode: %v", e)
}
}
func main() {
var config Config
config.read(`{
"address": "10.0.0.2:8080",
"debug": true,
"dburl": "localhost",
"google_api_key": "the-key"
}`)
log.Printf("api key %s", config.GoogleApiKey)
log.Printf("address %v", config.Address)
}
英文:
You're specifying your JSON names incorrectly in the struct.
GoogleApiKey string "google_api_key"
should be
GoogleApiKey string `json:"google_api_key"`
The JSON package looks for the json
header in the text. The backtick delimits a raw string which allows us to include the quotes around google_api_key.
http://play.golang.org/p/KNxYhzGLAp
package main
import (
"log"
"encoding/json"
)
type Config struct {
Address string `json:"address"`
Debug bool `json:"debug"`
DbUrl string `json:"dburl"`
GoogleApiKey string `json:"google_api_key"`
}
func (cfg *Config) read(json_code string) {
if e := json.Unmarshal([]byte(json_code), cfg); e != nil {
log.Printf("ERROR JSON decode: %v", e)
}
}
func main() {
var config Config
config.read(`{
"address": "10.0.0.2:8080",
"debug": true,
"dburl": "localhost",
"google_api_key": "the-key"
}`)
log.Printf("api key %s", config.GoogleApiKey)
log.Printf("address %v", config.Address)
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论