Json Unmarshaling in Golang

huangapple go评论86阅读模式
英文:

Json Unmarshaling in Golang

问题

我想在golang中解析以下json。我无法访问内部数据。最好的方法是什么?

{
  "1": {
    "enabled": 1,
    "pct": 0.5
  },
  "2": {
    "enabled": 1,
    "pct": 0.6
  },
  "3": {
    "enabled": 1,
    "pct": 0.2
  },
  "4": {
    "enabled": 1,
    "pct": 0.1
  }
}

我使用了以下代码:

type regs struct {
    enabled bool    `json:"enabled,omitempty"`
    pct     float64 `json:"pct,omitempty"`
}

var r map[string]regs
if err := json.Unmarshal([]byte(jStr), &r); err != nil {
    log.Fatal(err)
}
fmt.Printf("%+v\n", r)

但是我看不到结构体内部的值。
结果:map[1:{enabled:false pct:0} 2:{enabled:false pct:0} 3:{enabled:false pct:0} 4:{enabled:false pct:0}]

英文:

I want to unmarshal the followng json in golang. I am not able to access the inner data .
What is the best way to do it?

{
  "1": {
    "enabled": 1,
    "pct": 0.5
  },
  "2": {
    "enabled": 1,
    "pct": 0.6
  },
  "3": {
    "enabled": 1,
    "pct": 0.2
  },
  "4": {
    "enabled": 1,
    "pct": 0.1
  }
}

I use

type regs struct {
		enabled bool    `json:"enabled,omitempty"`
		pct     float64 `json:"pct,omitempty"`
	}

var r map[string]regs
if err := json.Unmarshal([]byte(jStr), &r); err != nil {
	log.Fatal(err)
}
fmt.Printf("%+v\n", r)

but i dont see the values inside the struct.
Result: map[1:{enabled:false pct:0} 2:{enabled:false pct:0} 3:{enabled:false pct:0} 4:{enabled:false pct:0}]

答案1

得分: 1

对于编组和解组,您应该将结构字段定义为导出字段,并且目标应该是regs的映射。
此外,bool类型对于Enabled字段无效,您应该将其更改为int类型。

type regs struct {
	Enabled int     `json:"enabled,omitempty"`
	Pct     float64 `json:"pct,omitempty"`
}

func main() {

	a := `{
		"1": {
		  "enabled": 1,
		  "pct": 0.5
		},
		"2": {
		  "enabled": 1,
		  "pct": 0.6
		},
		"3": {
		  "enabled": 1,
		  "pct": 0.2
		},
		"4": {
		  "enabled": 1,
		  "pct": 0.1
		}
	  }`
	dest := make(map[string]regs)
	json.Unmarshal([]byte(a), &dest)
	fmt.Println(dest)
}

输出将为:

map[1:{1 0.5} 2:{1 0.6} 3:{1 0.2} 4:{1 0.1}]
英文:

For Marshaling and Unmarshaling, you should define struct field as exported field, also the destination should be map of regs.
Also the bool type is not valid for the Enabled and you should change it to int

type regs struct {
	Enabled int     `json:"enabled,omitempty"`
	Pct     float64 `json:"pct,omitempty"`
}

func main() {

	a := `{
		"1": {
		  "enabled": 1,
		  "pct": 0.5
		},
		"2": {
		  "enabled": 1,
		  "pct": 0.6
		},
		"3": {
		  "enabled": 1,
		  "pct": 0.2
		},
		"4": {
		  "enabled": 1,
		  "pct": 0.1
		}
	  }`
	dest := make(map[string]regs)
	json.Unmarshal([]byte(a), &dest)
	fmt.Println(dest)
}

The output will be:

map[1:{1 0.5} 2:{1 0.6} 3:{1 0.2} 4:{1 0.1}]

huangapple
  • 本文由 发表于 2022年2月18日 02:45:47
  • 转载请务必保留本文链接:https://go.coder-hub.com/71163766.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定