Go结构体转JSON

一、什么是JSON

JSON(JavaScript Object Notation)是一种基于文本的轻量级数据交换格式。JSON采用完全独立于语言的文本格式来描述数据,这些特性使得JSON成为理想的数据交换语言。JSON常见于前后端数据交互,也逐渐成为替代XML的数据交换格式。

二、Go语言中的JSON支持

Go语言内置json包,提供了JSON数据的编解码功能,可直接导入使用。

import "encoding/json"

三、Go结构体转JSON

Go语言中,结构体可以通过编写tag的方法来定义该结构体的JSON格式。tag位于字段的结构体定义下方,是编译器在编译时对字段进行的描述。

通过tag的方式可以自定义JSON中的每个字段名。在tag中添加一个名为`json:””` 的选项即可。

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    person := Person{Name: "Tom", Age: 18}
    jsonData, _ := json.Marshal(person)
    fmt.Println(string(jsonData))
}

上述代码中,我们自定义了Person的两个字段在JSON中的名称,即`name` 和 `age`。使用json.Marshal方法,将Person结构体转换为JSON格式的字符串,输出结果如下:

{"name":"Tom","age":18}

四、结构体嵌套转换为JSON

在实际应用中,结构体通常包含多个字段,甚至是嵌套结构体。在Go语言中,同样可以通过tag的方式来定义结构体的JSON格式。

type Address struct {
    Province   string `json:"province"`
    City       string `json:"city"`
    Area       string `json:"area"`
    Street     string `json:"street"`
    PostalCode string `json:"postal_code"`
}

type Person struct {
    Name    string  `json:"name"`
    Age     int     `json:"age"`
    Address Address `json:"address"`
}

func main() {
    address := Address{Province: "ZheJiang", City: "HangZhou", Area: "XiHu", Street: "WenSanLu", PostalCode: "310023"}
    person := Person{Name: "Tom", Age: 18, Address: address}
    jsonData, _ := json.Marshal(person)
    fmt.Println(string(jsonData))
}

输出结果如下:

{"name":"Tom","age":18,"address":{"province":"ZheJiang","city":"HangZhou","area":"XiHu","street":"WenSanLu","postal_code":"310023"}}

五、切片和Map转换为JSON

除了结构体,切片和Map也经常出现在JSON编解码中。和结构体一样,切片和Map的转换也需要通过tag的方式来指定键名。

type Person struct {
    Name    string              `json:"name"`
    Age     int                 `json:"age"`
    Hobbies []string            `json:"hobbies"`
    Metas   map[string]string   `json:"metas"`
}

func main() {
    person := Person{
        Name:    "Tom",
        Age:     18,
        Hobbies: []string{"coding", "running", "reading"},
        Metas:   map[string]string{"height": "184cm", "weight": "70kg"},
    }
    jsonData, _ := json.Marshal(person)
    fmt.Println(string(jsonData))
}

上述代码中,我们定义了一个Person结构体,并且包含了切片和Map类型的字段。使用json.Marshal方法,将Person结构体转换为JSON格式的字符串,输出结果如下:

{"name":"Tom","age":18,"hobbies":["coding","running","reading"],"metas":{"height":"184cm","weight":"70kg"}}

六、转换为JSON时的返回值

在编写代码的过程中,我们可能会需要知道json.Marshal方法转化后的返回值,该返回值有两种类型。

第一种类型为`[]byte`类型,表示将结构体转换为JSON格式后得到的字节序列。

jsonData, err := json.Marshal(person)
if err != nil {
    // 错误处理
}

fmt.Println(jsonData)

第二种类型为`error`类型。当转换出错时,将返回该类型的非空值。

jsonData, err := json.Marshal(person)
if err != nil {
    // 错误处理
}

fmt.Println(err)

七、从JSON转换为Go结构体

在实际开发中,还经常会遇到从JSON格式的字符串转换为Go结构体的需求。Go语言中提供了json包中的json.Unmarshal方法来完成该转换过程。

使用json.Unmarshal方法,我们需要声明一个目标类型的指针,并调用json.Unmarshal方法来实现JSON格式字符串到指定类型的转换。

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    jsonStr := `{"name":"Tom","age":18}`
    person := Person{}
    err := json.Unmarshal([]byte(jsonStr), &person)
    if err != nil {
        // 错误处理
    }
    fmt.Printf("%+v", person)
}

上述代码中,我们声明了一个Person结构体的指针变量`person`作为目标类型,并使用json.Unmarshal方法将JSON字符串转换为结构体实例。输出转换后的Person对象,输出结果如下:

{Name:"Tom", Age:18}

八、小结

Go语言内置的json包提供了完善的JSON编解码功能,并且可以通过自定义tag的方式很容易地定义结构体的JSON格式。在实际开发中,我们需要熟练地掌握JSON转换的API以及tag的定义方法。同时,我们需要考虑到各种数据的可能性,避免出现一些JSON转换的异常状况。

原创文章,作者:VIDZ,如若转载,请注明出处:https://www.506064.com/n/136228.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
VIDZVIDZ
上一篇 2024-10-04 00:16
下一篇 2024-10-04 00:16

相关推荐

  • 运维Python和GO应用实践指南

    本文将从多个角度详细阐述运维Python和GO的实际应用,包括监控、管理、自动化、部署、持续集成等方面。 一、监控 运维中的监控是保证系统稳定性的重要手段。Python和GO都有强…

    编程 2025-04-29
  • go-chassis

    本文将深入探究go-chassis,包括它的基本概念,特性,以及如何使用它构建微服务应用程序。 一、微服务架构及其优势 微服务架构是一种将应用程序拆分为小型、自治服务的体系结构。每…

    编程 2025-04-29
  • Vue TS工程结构用法介绍

    在本篇文章中,我们将从多个方面对Vue TS工程结构进行详细的阐述,涵盖文件结构、路由配置、组件间通讯、状态管理等内容,并给出对应的代码示例。 一、文件结构 一个好的文件结构可以极…

    编程 2025-04-29
  • JSON的MD5

    在Web开发过程中,JSON(JavaScript Object Notation)是最常用的数据格式之一。MD5(Message-Digest Algorithm 5)是一种常用…

    编程 2025-04-29
  • Python程序的三种基本控制结构

    控制结构是编程语言中非常重要的一部分,它们指导着程序如何在不同的情况下执行相应的指令。Python作为一种高级编程语言,也拥有三种基本的控制结构:顺序结构、选择结构和循环结构。 一…

    编程 2025-04-29
  • 使用Java将JSON写入HDFS

    本篇文章将从以下几个方面详细阐述Java将JSON写入HDFS的方法: 一、HDFS简介 首先,先来了解一下Hadoop分布式文件系统(HDFS)。HDFS是一个可扩展性高的分布式…

    编程 2025-04-29
  • 使用Go-Redis获取Redis集群内存使用率

    本文旨在介绍如何使用Go-Redis获取Redis集群的内存使用率。 一、Go-Redis简介 Go-Redis是一个用于连接Redis服务器的Golang客户端。它支持Redis…

    编程 2025-04-28
  • Kong 使用第三方的go插件

    本文将针对Kong使用第三方的go插件进行详细阐述。首先,我们解答下标题的问题:如何使用第三方的go插件?我们可以通过编写插件来达到此目的。 一、插件架构介绍 Kong的插件系统采…

    编程 2025-04-28
  • Go中struct的初始化

    本文将从多个方面详细阐述Go中struct的初始化方式,包括使用字面量初始化、使用new函数初始化以及使用构造函数等。通过本文的介绍,读者能够更深入的了解Go中struct的初始化…

    编程 2025-04-28
  • 如何使用Newtonsoft datatable转Json

    Newtonsoft DataTable 是一个基于.NET的JSON框架,也是一个用于序列化和反序列化JSON的强大工具。 在本文中,我们将学习如何使用Newtonsoft Da…

    编程 2025-04-28

发表回复

登录后才能评论