golang生成JSON以及解析JSON

生成JSON:

在golang中生成JSON非常简单,可以使用标准库中的encoding/json包来实现。下面是一个示例代码:

package main

import (
    "encoding/json"
    "fmt"
)

type Person struct {
    Name   string `json:"name"`          // json tag,用于指定json key的名称
    Age    int    `json:"age"`
    Gender string `json:"gender"`
}

func main() {
    person := Person{
        Name:   "张三",
        Age:    18,
        Gender: "男",
    }

    jsonString, err := json.Marshal(person)
    if err != nil {
        fmt.Println("生成json失败!")
    } else {
        fmt.Println(string(jsonString))
    }
}

在上面的代码中,我们定义了一个Person结构体,该结构体的字段通过json tag来指定生成的json key的名称。在main函数中,我们创建了一个Person类型的变量,并使用json.Marshal函数将其转换为JSON字符串输出。

输出结果为:

{"name":"张三","age":18,"gender":"男"}

如果要将生成的JSON字符串进行格式化输出,可以使用json.MarshalIndent函数,如下所示:

jsonString, err := json.MarshalIndent(person, "", "  ")

上面的代码中,第一个参数为要转换成JSON字符串的对象,第二个参数为每一层缩进的字符串,第三个参数为使用的缩进字符串,本例中每一层使用两个空格缩进。

解析JSON:

在golang中解析JSON也非常简单,仍然可以使用标准库中的encoding/json包来实现。下面是一个示例代码:

package main

import (
    "encoding/json"
    "fmt"
)

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

func main() {
    jsonString := `{"name":"张三","age":18,"gender":"男"}`
    var person Person
    err := json.Unmarshal([]byte(jsonString), &person)
    if err != nil {
        fmt.Println("解析json失败!")
    } else {
        fmt.Println(person)
    }
}

在上面的代码中,我们定义了一个与生成JSON示例中相同的Person结构体。在main函数中,我们创建了一个包含JSON数据的字符串,然后使用json.Unmarshal函数将其转换为Person类型的对象,并输出转换后得到的Person对象。

输出结果为:

{张三 18 男}

如果JSON数据较大,我们可以使用json.Decoder来逐个解析JSON数据中的每个JSON对象,而不是一次性将整个JSON数据解码为一个对象,从而提高解析JSON数据的效率。示例如下:

package main

import (
    "encoding/json"
    "fmt"
    "strings"
)

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

func main() {
    jsonString := `{"users":[{"name":"张三","age":18},{"name":"李四","age":20}]}`
    decoder := json.NewDecoder(strings.NewReader(jsonString))

    for {
        var m map[string]interface{}
        err := decoder.Decode(&m)
        if err != nil {
            break
        }
        for k, v := range m {
            if k == "users" {
                users := v.([]interface{})
                for _, u := range users {
                    user := User{}
                    b, _ := json.Marshal(u)
                    json.Unmarshal(b, &user)
                    fmt.Println(user)
                }
            }
        }
    }
}

上面的代码中,我们定义了一个包含多个User对象的JSON数据。我们使用json.NewDecoder来创建一个json.Decoder,然后使用decoder.Decode方法逐个解析JSON数据中的每个JSON对象,最后将解析出来的JSON对象转换为User对象,并输出转换后得到的User对象。

输出结果为:

{张三 18}
{李四 20}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:golang生成JSON以及解析JSON - Python技术站

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

相关文章

  • LUNC币怎么购买交易?LUNC币买卖交易操作教程

    LUNC币是一种基于以太坊的ERC-20代币,主要用于中立联盟链平台上的交易和支付,下面是一份 LUNC币购买交易的操作教程。 步骤一:创建数字钱包 在进行LUNC币的购买交易前,您需要先创建一份数字钱包并备份好钱包的助记词。目前流行的数字钱包有MetaMask、MyEtherWallet和imToken等。一般来说,数字钱包会生成一个地址,然后你需要将以太…

    C 2023年5月23日
    00
  • C语言编程递归算法实现汉诺塔

    C语言编程递归算法实现汉诺塔的完整攻略 汉诺塔问题介绍 汉诺塔问题是经典的递归算法问题,首先是在1908年由Edouard Lucas提出,原始的问题定义为: 有三根相邻的柱子A、B、C,A柱子上有64个盘子,盘子大小不等,大的在下,小的在上。现在要把A柱子上的盘子全部移到C柱子上,并且每次只能移动一个盘子,大盘子不能叠在小盘子上面,请问至少需要多少次移动?…

    C 2023年5月23日
    00
  • 一篇文章带你了解C语言–数据的储存

    一篇文章带你了解C语言–数据的储存 在C语言中,数据的储存有三种方式:变量、数组和指针。 变量 变量是程序运行过程中储存数据的基本单位,它代表着一个内存地址,程序可以通过该地址访问该变量。 声明变量 在C语言中,变量的声明需要给出变量名和类型,如下: int a; float b; char c; 变量的赋值和读取 赋值使用等号“=”来实现,比如: a =…

    C 2023年5月23日
    00
  • C语言中强制类型转换的常见方法

    C语言中的强制类型转换指的是将一个数据类型转换成另一个数据类型。常见的强制类型转换方法包括以下几种: 1. 强制转换运算符 强制转换运算符包括(type)value、type(val)两种写法,其中type为要转换的目标数据类型,value为要转换的源数据。 示例: double a = 3.141592; int b = (int)a; // 强制将dou…

    C 2023年5月24日
    00
  • 剑网3明教怎么玩_剑网3明教贯木流PVE输出攻略(必看)

    剑网3明教怎么玩 简介 《剑网3》作为一款以武学为主题的MMORPG游戏,拥有多个门派供玩家选择。其中明教门派以其独树一帜的特点,备受玩家们的喜爱。本攻略将为大家介绍明教门派的PVE输出攻略,帮助各位玩家更好地在游戏中玩转明教职业。 明教门派的特点 明教门派主修内功心法,拥有较高的爆发输出和回复能力 明教的操作非常流畅,配合技能后摇短,能够进行多种连招输出 …

    C 2023年5月22日
    00
  • C语言使用指针前未初始化

    当我们使用C语言中的指针时,必须首先将指针初始化为一个合法的内存地址,否则就会发生未定义行为。未初始化指针可能仍然包含已分配给其他部分的地址值。这可能会导致在对该地址进行引用(解除引用)时出现崩溃或未知行为。本文将讲解如何在C语言中使用指针前正确初始化指针。 初始化指针 方法一:使用赋值语句初始化指针 可以通过简单地在定义指针变量时,设置为NULL指针进行初…

    C 2023年5月9日
    00
  • C++ Futures与Promises线程使用示例讲解

    C++ Futures与Promises是一种线程模型,用于异步操作的处理和结果的返回。在许多情况下,异步操作可以显著提高程序的性能和响应能力。本文将介绍如何使用C++ Futures与Promises实现异步操作。下面我们通过两个示例来了解C++ Futures与Promises的使用。 示例一 假设我们需要统计一个文本文件中某个单词出现的次数。由于文本文…

    C 2023年5月22日
    00
  • 使用Protocol Buffers的C语言拓展提速Python程序的示例

    使用Protocol Buffers的C语言拓展能够提高Python程序的运行速度。下面是使用方法的完整攻略: 1. 安装Protocol Buffers 使用Protocol Buffers前,需要先安装它。可以使用以下命令安装: $ sudo apt-get install protobuf-compiler libprotobuf-dev 2. 编写协…

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