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

 更新时间:2021年03月22日 15:01:19   作者:y思无邪  
这篇文章主要介绍了Go 使用Unmarshal将json赋给struct出错的原因及解决方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

例如:

将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}

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

相关文章

  • Windows系统中搭建Go语言开发环境图文详解

    Windows系统中搭建Go语言开发环境图文详解

    GoLand 是 JetBrains 公司推出的商业 Go 语言集成开发环境(IDE),这篇文章主要介绍了Windows系统中搭建Go语言开发环境详解,需要的朋友可以参考下
    2022-10-10
  • Go常问的一些面试题汇总(附答案)

    Go常问的一些面试题汇总(附答案)

    通常我们去面试肯定会有些不错的Golang的面试题目的,所以总结下,让其他Golang开发者也可以查看到,同时也用来检测自己的能力和提醒自己的不足之处,这篇文章主要给大家介绍了关于Go常问的一些面试题以及答案的相关资料,需要的朋友可以参考下
    2023-10-10
  • Golang如何使用go.mod配置加载本地模块

    Golang如何使用go.mod配置加载本地模块

    这篇文章主要介绍了Golang如何使用go.mod配置加载本地模块问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • golang logrus日志框架实例详解

    golang logrus日志框架实例详解

    logrus是一个可插拔的、结构化的日志框架,这篇文章主要介绍了golang logrus日志框架实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • golang interface判断为空nil的实现代码

    golang interface判断为空nil的实现代码

    这篇文章主要介绍了golang interface判断为空nil的实现代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • golang 实现时间戳和时间的转化

    golang 实现时间戳和时间的转化

    这篇文章主要介绍了golang 实现时间戳和时间的转化操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • Go语言利用Unmarshal解析json字符串的实现

    Go语言利用Unmarshal解析json字符串的实现

    本文主要介绍了Go语言利用Unmarshal解析json字符串的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • Go设计模式之策略模式讲解和代码示例

    Go设计模式之策略模式讲解和代码示例

    策略是一种行为设计模式, 它将一组行为转换为对象, 并使其在原始上下文对象内部能够相互替换,本文就将通过代码示例给大家详细的介绍一下Go的策略模式,需要的朋友可以参考下
    2023-08-08
  • Go Gin框架中的路由组及其优先级探索分析

    Go Gin框架中的路由组及其优先级探索分析

    在构建Web应用程序时,理解和有效地使用路由是至关重要的,Go语言的Gin框架为此提供了强大的工具,特别是通过其路由组功能,本文将深入探讨Gin的RouterGroup,特别是在路径匹配和优先级方面的行为
    2024-01-01
  • Golang限流器time/rate设计与实现详解

    Golang限流器time/rate设计与实现详解

    在 Golang 库中官方给我们提供了限流器的实现golang.org/x/time/rate,它是基于令牌桶算法(Token Bucket)设计实现的,下面我们就来看看他的具体使用吧
    2024-03-03

最新评论