使用PHP和Javascript(和Node)解析JSON是一项非常简单的操作。从它的外观来看,Go更加复杂。考虑下面的例子
package main
import ("encoding/json";"fmt")
type fileData struct{
tn string
size int
}
type jMapA map[string] string
type jMapB map[string] fileData
func parseMapA(){
var dat jMapA
s := `{"lang":"Node","compiled":"N","fast":"maybe"}`
if err := json.Unmarshal([]byte(s), &dat); err != nil {
panic(err)
}
fmt.Println(dat);
for k,v := range dat{
fmt.Println(k,v)
}
}
func parseMapB(){
var dat jMapB
s := `{"f1":{"tn":"F1","size":1024},"f2":{"tn":"F2","size":2048}}`
if err := json.Unmarshal([]byte(s), &dat); err != nil {
panic(err)
}
fmt.Println(dat);
for k,v := range dat{
fmt.Println(k,v)
}
}
func main() {
parseMapA()
parseMapB()
}
parseMapA()
来电必须返回
map[lang:Node Compiled:N fast:maybe]
lang Node
compiled N
fast maybe
但是,parseMapB()
会返回
map[f1:{ 0}, f2:{ 0}]
f2 { 0}
f1 { 0}
我进入Go的前几个小时,所以我想我在这里做错了。但是,我不知道那可能是什么。我非常感谢任何帮助。更一般地说,Go等价于Node代码
for(p in obj){
doSomethingWith(obj[p]);
}
在Go?
答案 0 :(得分:2)
在Go中,仅当结构具有导出字段时,解组才有效。以大写字母开头的字段。
将您的第一个结构更改为:
type fileData struct{
Tn string
Size int
}
有关修复示例,请参阅http://play.golang.org/p/qO3U7ZNrNs。
此外,如果您打算将此结构封装回JSON,您会注意到生成的JSON使用大写字段,这不是您想要的。
您需要添加字段标记:
type fileData struct{
Tn string `json:"tn"`
Size int `json:"size"`
}
所以Marshal函数将使用正确的名称。