Golang编程基础第三篇——Golang对Json处理

舒阳州
2023-12-01

目录

 

一,什么是Json

二,Golang对json的编码解码

三,补充与实践


本文讲述golang如何把结构数据转化成json,json文件数据转化成struct数据的,并给出例子。

一,什么是Json

JSON(JavaScript Object Notation)是一种基于JavaScript语法子集的开放标准数据交换格式。JSON是基于文本的,轻量级的,通常被认为易于读/写。

Json是一种比XML更轻量级的数据交换格式,更适合成为较为理想,跨平台,跨语言的数据交换语言,成为项目配置文件的首选。开发者可以用Json传输简单的字符串,数字,布尔值,也可以传输一个数组,或者更复杂的复合结构。广泛应用在web服务端与客户端之间通信或者RPC通信中。

Golang内建对json的支持,使用encoding/json标准库,就可以使用go程序生成和解析Json格式的数据。

那具体怎么使用golang对json的转化呢?

二,Golang对json的编码解码

Golang库中对json编解码的函数是json.Marshal()和json.Unmarshal()。

JSON编码

编码时,json.Marshal()函数声明如下:

func Marshal(v interface{}) ([]byte, error)

用Marshal函数的步骤如下:

1. 准备一个类型的结构体,如Book

type Book struct {
    Title string
    Authors []string
    IsPublished bool
}

2. 针对Book类型有一个实例对象

go book := Book {
    "Go语言编程"
    {"ABC", "CDA"}
    true
}

3. 使用json.Marshal()将gobook实例生成一段json格式的文本

b, err := json.Marshal(gobook)

/*
b变量结果为
b == []byte(`{
    "Title": "Go语言编程",
    "Authors": ["ABC","DBA"],
    "IsPublished": true
}`)
*/

当我们调用json.Marshal(gobook)时,会递归遍历gobook对象,如果发现gobook数据结构实现编码接口并包含有效值,Marshal()就会调用MarshalJSON()方法生成JSON格式的文本。

JSON解码

解码时,使用Unmarshal()将json文本解码为go预期的数据结构,json.Unmarshal()原型如下:

func Unmarshal(data []byte, v interface{}) error

使用Unmarshal()的步骤如下:

1. 在go中创建一个目标类型的实例对象,用于存放解码后的值

var book Book

调用unmarshal函数,将byte[]类型的json数据作为第一个参数传入,将book实例变量作为第二个参数传入

err := json.Unmarshal(b, &book)

如果json数据和book一一对应,就可以把json值放入book变量中。

如何解码?

json.Unmarshal()会根据约定的顺序查找标签字段,当json数据里边的结构和目标类型结构对不上,在解码过程中会丢弃该字段。

另外,在go的标准库中,允许使用map[string]interface{}和[]interface{}类型来存放未知结构的json对象或数组

对于json的流式读写,用Decoder和Encoder类型来操作

func NewDecoder(r io.Reader) *Decoder

func NewEncoder(w io.writer) *Encoder

三,补充与实践

这里补充json标签的概念,tag就是标签,给结构体的每个字段打上一个标签,标签冒号前是类型,后面是标签名

package main

import (
	"encoding/json"
	"fmt"
)

// IP 
type IPBlackList struct {
    IP      []string  `json:"IP"`
}

func main() {
	p := &IPBlackList{}
	p.IP = []string{"172.16.1.236", "172.16.1.235", "127.0.0.1"}
	data, _ := json.Marshal(p)
	fmt.Println(string(data))
}

输出:

{"IP":["172.16.1.236","172.16.1.235","127.0.0.1"]}

 

关于json文件转golang struct 发现网上很多例子都是错的 根本读不出来,以我为准:

// convert json to struct

package main


import (
    "fmt"
    "encoding/json"
)

type Host struct {
    BlackListIP []string 
	WhiteListIP []string 
}

func main() {
    b := []byte(`{
    "blackListIP":["172.16.1.236","172.16.1.235","127.0.0.1"],
    "whiteListIP":["172.16.1.230"]
}`)

    m := Host{}

    err := json.Unmarshal(b, &m)
    if err != nil {

        fmt.Println("Umarshal failed:", err)
        return
    }

    fmt.Println("m:", m)
	if len(m.WhiteListIP) == 0 {
		for _, ip := range m.BlackListIP {
			fmt.Println("m.BlackListIP: ", ip)
		}
	} else {
		for _, ip := range m.WhiteListIP {
			fmt.Println("m.WhiteListIP: ", ip)
		}
	}
}

这段代码逻辑是在配置json文件中,如果存在白名单ip,则执行白名单ip;否则如果存在黑名单ip,则执行黑名单ip逻辑(开启ip限制开关在其他地方配置)

输出:

m: {[172.16.1.236 172.16.1.235 127.0.0.1] [172.16.1.230]}
m.WhiteListIP:  172.16.1.230

参考:go语言基础

 类似资料: