json - Golang - 使用/遍历 JSON 解析映射

标签 json parsing go

使用 PHP 和 JavaScript(以及 Node)解析 JSON 是一项非常简单的操作。从它的外观来看,围棋要复杂得多。考虑以下示例:

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]);
}

在围棋?

最佳答案

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

关于json - Golang - 使用/遍历 JSON 解析映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30896040/

相关文章:

java - 如何获取 AST 中节点的完全限定名称?

用于自定义标记语言的 Ruby 标记解析器

go - 为具有多个包的项目做出贡献

javascript - 如果 JSON-LD 没有 ID,有没有办法通过 JavaScript 访问它?

java - 我可以从 Firebase Remote Config 的默认值中获取 JSONObject

python - <>在python中用beautifulsoup解析html时改为<和>

go - 为什么这个 golang 程序在使用带有 select 的 for 循环时卡在 Playground 上?

java - Gson - 关于版本控制的问题

java - Jackson:序列化 EER 特化

variables - := 左侧没有新变量