【问题标题】:Golang - using/iterating through JSON parsed mapGolang - 使用/迭代 JSON 解析的地图
【发布时间】:2015-06-17 15:31:46
【问题描述】:

使用 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 的几个小时,所以我想我在这里做错了什么。但是,我不知道那可能是什么。更一般地说,Node 代码的 Go 等价物是什么

for(p in obj){
  doSomethingWith(obj[p]);
}

在围棋?

【问题讨论】:

标签: json parsing go


【解决方案1】:

在 Go 中,仅当结构具有 exported 字段时,解组才有效,即。以大写字母开头的字段。

将您的第一个结构更改为:

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 函数将使用正确的名称。

【讨论】:

  • 与 PHP 和 Node 相比,我不太清楚为什么 JSON 解析在 Go 中要复杂得多,但我想是有原因的。
  • 对于初学者来说,Go 是一种静态类型的编译语言,与 PHP 和 Javascript 不同。另一方面,尝试在 C 中做同样的事情,然后你会发现 Go 并没有那么难:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-07
  • 2014-01-20
  • 1970-01-01
  • 2015-04-06
  • 2018-01-27
  • 1970-01-01
  • 2019-11-13
相关资源
最近更新 更多