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

  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日

相关文章

  • win10下定时运行与开机自启动jar包的方法记录

    我来给你详细讲解win10下定时运行与开机自启动jar包的方法。我们可以分为两个部分来讲解,下面将分别进行详细介绍。 一、定时运行jar包的方法记录 1.安装JRE环境 在运行Java程序之前,需要安装Java Runtime Environment(JRE)环境。可以在官网下载安装。 2.运行jar包 运行jar包有多种方法,我们这里介绍一种简单的方法:使…

    C 2023年5月22日
    00
  • 深入N皇后问题的两个最高效算法的详解

    让我来详细讲解一下“深入N皇后问题的两个最高效算法的详解”。 算法一:位运算 算法思路 基于位运算的 N 皇后问题算法,是一种高效的算法。其核心思路在于将每行、每列、每条对角线(包括左上角至右下角、右上角至左下角)都用一个二进制数来表示,通过位运算的方式来判断该位置是否可以放皇后。 其中,用两个 int 类型的变量 col 和 ld 来表示列和左对角线(左上…

    C 2023年5月22日
    00
  • C++实现简单的学生管理系统

    C++实现学生管理系统攻略 1. 确定系统功能 学生管理系统有很多功能,有录入学生信息、显示学生信息、修改学生信息、删除学生信息等。确定系统功能是实现该系统的第一步。本系统以录入、显示、修改、删除学生信息为功能点展开。 2. 设计学生类 学生信息的属性有:学号、姓名、性别、出生年月、成绩。因此,我们可以设计一个学生类 Student,并在其中定义相应的属性和…

    C 2023年5月22日
    00
  • C语言返回动态分配内存的地址

    C语言中,返回动态分配内存的地址通常使用指针类型函数实现。在这种情况下,C语言程序需要使用malloc()等函数手动分配内存,并返回指向分配内存空间的指针。以下是如何返回动态分配内存的地址的完整使用攻略。 步骤1:使用malloc()函数分配内存空间 在C语言中,使用malloc()函数可以手动分配内存空间。该函数需要一个整数作为参数,指定需要分配的内存空间…

    C 2023年5月9日
    00
  • C语言函数返回指针

    C语言中的函数可以返回不同的数据类型,包括指针类型。函数返回指针类型可以让我们更加灵活地操作内存,提高代码的重用性和可维护性。 在函数定义的时候,我们需要用指针类型作为返回值类型,并在函数体中返回指向目标数据的指针。以下是函数返回指针的基本语法: int* myFunction() { int* ptr = malloc(sizeof(int)); *ptr…

    C 2023年5月9日
    00
  • C语言实现BF算法案例详解

    C语言实现BF算法案例详解 什么是BF算法 BF算法是一种简单的字符串匹配算法,它的全称为Brute Force算法,中文翻译为暴力匹配算法。该算法的思想是对匹配串中与主串中的字符逐一进行比较,直到匹配成功或者不匹配结束。 实现BF算法的步骤 步骤一:暴力匹配 我们可以从主串的第一个字符开始,每次匹配一个字符,直到匹配成功或者匹配失败为止。如果匹配成功,就继…

    C 2023年5月22日
    00
  • C语言五子棋小游戏实现代码

    C语言五子棋小游戏的实现代码,主要分为以下几步: 1. 游戏窗口的设计与绘制 游戏窗口的设计可以使用Windows API库中的CreateWindow () 函数进行实现。需要指定窗口的标题、大小、风格等参数。具体可以参考以下代码示例: //创建窗口的函数 HWND hWindow; hWindow = CreateWindow( "Window…

    C 2023年5月24日
    00
  • C语言三子棋一步步实现详程

    C语言三子棋一步步实现详程 本文介绍如何用C语言实现三子棋游戏,并提供了一步步的实现攻略。在实现过程中,我们将会用到C语言的基本语法和数据结构。 游戏规则 三子棋游戏是一种两人对弈的游戏。玩家在一个3×3的九宫格上轮流放置X或O。如果其中一方在棋盘上形成一个连成一线的3个棋子,就获胜了。 实现思路 我们将在控制台上实现这个游戏,并按照以下步骤进行实现: 初始…

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