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

yizhihongxing
  1. 问题描述

在使用Go语言的Unmarshal函数将json数据赋给struct时,可能会遇到一些出错的情况。

下面是一个例子:

package main

import (
    "encoding/json"
    "fmt"
)

type Person struct {
    Name string
    Age  int
}

func main() {
    var p Person
    err := json.Unmarshal([]byte(`{"name": "Alice", "age": "26"}`), &p)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(p.Name, p.Age)
}

这个例子中,我们将一个json字符串{"name": "Alice", "age": "26"}赋给Person结构体,然后使用Unmarshal函数进行解析。但是,程序报错了:

json: cannot unmarshal string into Go struct field Person.age of type int

问题原因是json数据中的age字段是一个字符串类型,而Person中的age字段是整型,无法直接将一个字符串值赋给整型变量。

如果我们不改变程序中的json数据,那么就无法将其正确地赋给Person结构体,导致程序出错。

  1. 解决方法

为了解决这个问题,我们可以做如下修改:

package main

import (
    "encoding/json"
    "fmt"
    "strconv" // 引入 strconv 包,用于字符串和整型之间的转换
)

type Person struct {
    Name string
    Age  int
}

func main() {
    var p Person
    err := json.Unmarshal([]byte(`{"name": "Alice", "age": "26"}`), &p)
    if err != nil {
        fmt.Println(err)
    }
    age, err := strconv.Atoi(p.Age) // 将 p.Age 字符串转换为整型
    if err != nil {
        fmt.Println(err)
    }
    p.Age = age // 将转换后的整型值赋给 p.Age
    fmt.Println(p.Name, p.Age)
}

这个例子中,我们引入了strconv包,用于将string类型的p.Age字段转换为int类型。

首先,我们使用Unmarshal函数将json数据赋给Person结构体。然后,我们使用strconv.Atoi函数将p.Age字符串转换为整型变量,并将其保存在age变量中。

如果转换失败,我们需要处理错误。最后,我们将age变量赋值给Person结构体中的Age字段,完成赋值操作。

这样,我们就可以正确地将json数据赋给Person结构体了。

  1. 示例说明

下面再给出一个更为复杂的示例,用于进一步说明如何使用Unmarshal函数赋值。

package main

import (
    "encoding/json"
    "fmt"
)

type Address struct {
    City    string
    Country string
}

type Person struct {
    Name   string
    Age    int
    Addr   Address
    Phones []string
}

func main() {
    var p Person
    err := json.Unmarshal([]byte(`{
        "name": "Alice",
        "age": 26,
        "addr": {
            "city": "Hangzhou",
            "country": "China"
        },
        "phones": ["123456", "987654"]
    }`), &p)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(p.Name, p.Age, p.Addr.City, p.Addr.Country, p.Phones)
}

这个例子中,我们定义了一个Person结构体,其中包含了一个嵌套的Address结构体和一个string类型的切片Phones

我们使用Unmarshal函数将一个复杂的json字符串赋给Person结构体。然后,我们可以通过Person结构体中的各个字段访问json数据的各个属性。

  1. 总结

在使用Go语言的Unmarshal函数将json数据赋给struct时,需要注意数据类型的匹配。如果json数据中的值类型和struct中定义的类型不匹配,可以使用一些类型转换函数解决问题。

在处理复杂的json数据时,可以定义嵌套的结构体来表示不同层次的数据结构,然后使用Unmarshal函数逐层解析数据。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Go 使用Unmarshal将json赋给struct出错的原因及解决 - Python技术站

(1)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C++简单实现shared_ptr的代码

    实现一个简单的shared_ptr需要考虑以下几个方面: 1.计数器实现:将指针的计数器放在一个自定义类中,当有多个shared_ptr指向同一个对象时,计数器加1;当一个指针被销毁时,计数器减1;当计数器为0时,释放对象所占用的内存。 2.拷贝构造函数和赋值运算符实现:在拷贝构造函数和赋值运算符中,需要将新对象的计数器指向原对象的计数器,使得两个对象指向同…

    C 2023年5月23日
    00
  • C语言实现歌手大奖赛计分程序

    C语言实现歌手大奖赛计分程序 程序实现功能 本程序主要实现歌手大奖赛计分功能,包括对选手的评分以及最终的排名输出。 实现思路 程序主要分为以下几个步骤进行实现: 获取选手总数 获取评委人数 获取选手分数 对选手的得分进行排序 最终输出选手排名 具体实现步骤 获取选手总数以及评委人数 可以使用scanf函数来获取用户输入的选手总数以及评委人数。 int sin…

    C 2023年5月23日
    00
  • 详解C++编程中断言static_assert的使用

    详解C++编程中断言static_assert的使用 在C++中,当我们需要在编译期进行类型检查或常量计算时,可以使用static_assert。具体来说,static_assert是一个语言特性,用于在编译期进行断言判断,如果判断条件为false,则程序会在编译期抛出一个编译错误,阻止程序的继续编译。 用法 static_assert可以用于两种类型的判断…

    C 2023年5月23日
    00
  • C/C++高精度算法的实现

    C/C++高精度算法的实现攻略 什么是高精度算法? 在计算机上进行数学运算通常都是使用二进制来表示数字,而二进制可以在内存中用 0 和 1 表示。在使用标准类型(如 int, long)时,它们可以很方便地执行大量的数学运算。但是,对于较大的数字或需要较高精度的计算,这些类型可能无法满足需求,因为它们只能容纳有限数量的比特,从而有限表示。基于这些原因诞生了高…

    C 2023年5月23日
    00
  • 一文详解C++模板和泛型编程

    一文详解C++模板和泛型编程 简介 C++模板是实现泛型编程的基础。泛型编程是一种编程范式,通过参数化来实现算法的一种方式。C++模板可以用来定义不特定类型的函数、类等,可以减少代码的重复编写,提高代码的可维护性和可复用性。 模板的定义和使用 函数模板 函数模板可以用来定义可以适用于多种类型的函数。函数模板需要使用关键字template定义,后面跟尖括号&l…

    C 2023年5月23日
    00
  • C++用boost.signal实现多播委托

    使用boost.signal实现多播委托的攻略如下: 安装boost库 首先需要安装boost库,可以从官网下载最新的boost源码,然后解压缩到本地,进入到boost目录下执行以下命令: ./bootstrap.sh –prefix=/usr/local/boost ./b2 install 这样boost库就安装到了/usr/local/boost目录…

    C 2023年5月23日
    00
  • C语言实现简单的三子棋

    C语言实现简单的三子棋攻略 三子棋游戏是一款简单的棋类游戏,它由一个3×3的棋盘和两种不同的棋子组成(通常是‘X’和‘O’)。此游戏通常在由两人轮流下子的情况下进行,先把三个棋子排成横线、竖线、对角线中的任意一种情况者获胜,若棋盘被下满棋子但无任何一方获胜,则视为平局游戏结束。 C语言是一门非常优秀的编程语言,可以通过它实现三子棋游戏,并可以在控制台进行游戏…

    C 2023年5月23日
    00
  • C 基本语法

    当我们学习一个新的编程语言时,首先需要了解其基本语法。下面是 C 语言基本语法的完整使用攻略。 基本语法 C 语言基本语法包括:标识符、数据类型、常量、变量、运算符、表达式、语句和函数。 标识符 标识符是用于表示变量、函数、数组等的名称。在 C 语言中,标识符遵循如下规则: 标识符由字母、下划线和数字组成 第一个字符必须是字母或下划线 标识符大小写敏感 数据…

    C 2023年5月10日
    00
合作推广
合作推广
分享本页
返回顶部