我开始学习GO,我遇到过这个问题。 我有这个代码
package main
import (
"fmt"
"encoding/json"
// "net/html"
)
func main(){
type Weather struct {
name string
cod float64
dt float64
id float64
}
var rawWeather = []byte(`{"name":"London","cod":200,"dt":1407100800,"id":2643743}`)
var w Weather
err := json.Unmarshal(rawWeather, &w)
if err != nil {
fmt.Println("Some error", err)
}
fmt.Printf("%+v\n",w)
}
当我运行它时,它显示了这个
[nap@rhel projects]$ go run euler.go
{name: cod:0 dt:0 id:0}
因此,JSON未被解析为天气结构。
任何想法,为什么会这样发生?
答案 0 :(得分:6)
您需要将结构字段大写。 E.g:
Name string
Cod float64
// etc..
这是因为在尝试解组时,json
包不会看到它们。
答案 1 :(得分:0)
通过quessing,我发现,这段代码有效:
package main
import (
"fmt"
"encoding/json"
// "net/html"
)
func main(){
type Weather struct {
Name string
Cod float64
Dt float64
Id float64
}
var rawWeather = []byte(`[{"name":"London","cod":200,"dt":1407100800,"id":2643743}]`)
var w []Weather
err := json.Unmarshal(rawWeather, &w)
if err != nil {
fmt.Println("Some error", err)
}
fmt.Printf("%+v\n",w)
}
因此,结构字段名称必须大写才能正常工作!
答案 2 :(得分:0)
这是因为Weather
不会导出任何字段。这;
type Weather struct {
name string
cod float64
dt float64
id float64
}
需要;
type Weather struct {
Name string
Cod float64
Dt float64
Id float64
}
如果未导出字段,则json包将无法访问它。您可以在http://blog.golang.org/json-and-go找到有关它的更多信息,但简短版本是;
“json包只访问struct类型的导出字段(以大写字母开头的字段)。因此,只有结构的导出字段才会出现在JSON输出中。”