返回顶部
首页 > 资讯 > 后端开发 > GO >Go 使用Unmarshal将json赋给struct出错的原因及解决
  • 938
分享到

Go 使用Unmarshal将json赋给struct出错的原因及解决

JSONGOstruct 2022-06-07 20:06:53 938人浏览 独家记忆
摘要

例如: 将JSON: { "name": "Laura" "age": "18" } 赋给struct: type PersonalInfo struct { Nam

例如:

JSON

{
 "name": "Laura"
 "age": "18"
}
赋给struct:

type PersonalInfo struct {
 Name string `json:"name"`
 Age string `json:"age"`
}
用语句:

person := PersonalInfo{}
err := json.Unmarshal(json, &persona)//json为上面的[]byte
出错原因:

1、struct中变量名是不可导出的(首写字母是小写的),需要把首写字母改成大写

2、需要传输person的指针

3、struct中json的名字与json中的名字需要一模一样

补充:Go语言处理JSON之——利用Unmarshal解析json字符串

简单的解析例子:

首先还是从官方文档中的例子:


package main
import (
 "fmt"
 "encoding/json"
)
type Animal struct {
 Name string
 Order string
}
func main() {
 var jsonBlob = []byte(`[
 {"Name": "Platypus", "Order": "Monotremata"},
 {"Name": "Quoll", "Order": "Dasyuromorphia"}
 ]`)
 var animals []Animal
 err := json.Unmarshal(jsonBlob, &animals)
 if err != nil {
  fmt.Println("error:", err)
 }
 fmt.Printf("%+v", animals)
}

输出:


[{Name:Platypus Order:Monotremata} {Name:Quoll Order:Dasyuromorphia}]

简单进行修改,修改为:


package main
import (
 "fmt"
 "encoding/json"
)
type Animal struct {
 Name string
 Order string
}
func main() {
 var jsonBlob = []byte(`{"Name": "Platypus", "Order": "Monotremata"}`)
 var animals Animal
 err := json.Unmarshal(jsonBlob, &animals)
 if err != nil {
  fmt.Println("error:", err)
 }
 fmt.Printf("%+v", animals)
}

输出:


{Name:Platypus Order:Monotremata}
还是之前的例子:

解析这样的一个json字符串


{
 "first fruit":
 {
  "describe":"an apple",
  "icon":"appleIcon",
  "name":"apple"
 },
 "second fruit":
 {
  "describe":"an orange",
  "icon":"orangeIcon",
  "name":"orange"
 },
 "three fruit array":
 [
  "eat 0",
  "eat 1",
  "eat 2",
  "eat 3",
  "eat 4"
 ]
}
Go代码:

package main
import (
 "fmt"
 "encoding/json"
)
type Fruit struct {
 Describe string `json:"describe"`
 Icon  string `json:"icon"`
 Name  string `json:"name"`
}
type FruitGroup struct {
 FirstFruit *Fruit `json:"first fruit"` //指针,指向引用对象;如果不用指针,只是值复制
 SecondFruit *Fruit `json:"second fruit"` //指针,指向引用对象;如果不用指针,只是值复制
 THreeFruitArray []string `json:"three fruit array"`
}
func main() {
 var jsonBlob = []byte(`{
 "first fruit": {
  "describe": "an apple",
  "icon": "appleIcon",
  "name": "apple"
 },
 "second fruit": {
  "describe": "an orange",
  "icon": "appleIcon",
  "name": "orange"
 },
 "three fruit array": [
  "eat 0",
  "eat 1",
  "eat 2",
  "eat 3"
 ]}`)
 var fruitGroup FruitGroup
 err := json.Unmarshal(jsonBlob, &fruitGroup)
 if err != nil {
  fmt.Println("error:", err)
 }
 fmt.Printf("%+v\n", fruitGroup)
 fmt.Printf("%+v\n", fruitGroup.FirstFruit)
 fmt.Printf("%+v\n", fruitGroup.SecondFruit)
}

运行结果:


{FirstFruit:0xc00006c5a0 SecondFruit:0xc00006c5d0 THreeFruitArray:[eat 0 eat 1 eat 2 eat 3]}
&{Describe:an apple Icon:appleIcon Name:apple}
&{Describe:an orange Icon:appleIcon Name:orange}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。如有错误或未考虑完全的地方,望不吝赐教。


您可能感兴趣的文档:

--结束END--

本文标题: Go 使用Unmarshal将json赋给struct出错的原因及解决

本文链接: https://lsjlt.com/news/30658.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作