Golang学习笔记之JSON解析

栏目: Go · 发布时间: 7年前

内容简介:官方提供有Json解析包:官方库文档地址•字段的tag是“-”,那么这个字段不会输出到JSON•tag中带有自定义名称,那么这个自定义名称会出现在JSON的字段名中。

JSON是一种轻量级的数据交换语言,以文字为基础,具有自我描述性且易于让人阅读。

官方提供有Json解析包:官方库文档地址

下面只说两个比较重要的函数

一、将数据编码成json字符串

函数原型

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

Marshal函数返回v的json编码。v是interface{}类型,任何类型都实现了空接口。

•字段的tag是“-”,那么这个字段不会输出到JSON

•tag中带有自定义名称,那么这个自定义名称会出现在JSON的字段名中。

•tag中如果带有“omitempty”选项,那么如果该字段值为空,就不会输出到JSON串中

•如果字段类型是bool,string,int,int64等,而tag中带有“,string”选项,那么这个字段在输出到JSON的时候会把该字段对应的值转换成JSON字符串

下面是官方给的解释

// 字段被本包忽略
Field int `json:"-"`
// 字段在json里的键为"myName"
Field int `json:"myName"`
// 字段在json里的键为"myName"且如果字段为空值将在对象中省略掉
Field int `json:"myName,omitempty"`
// 字段在json里的键为"Field"(默认值),但如果字段为空值会跳过;注意前导的逗号
Field int `json:",omitempty"`

demo

package main
import (
    "encoding/json"
    "fmt"
)

//Student 结构体
type Student struct {
    Name string
    Age  int
}

//Person JSON字段标签
type Person struct {
    Name        string `json:"username"` //自定义名称
    Age         int
    Gender      bool `json:",omitempty"` //如果该字段值为空,就不会输出到JSON串中
    Profile     string
    OmitContent string `json:"-"`       //字段不会输出到JSON
    Count       int    `json:",string"` //自定义名称
}

func main() {
    //结构体序列化为JSON
    s := Student{"黄哲", 20}
    if bs, err := json.Marshal(s); err != nil {
        panic(err)
    } else {
        fmt.Println(string(bs)) //{"Name":"黄哲","Age":20}
    }

    //切片序列化为JSON
    s1 := Student{"张三", 21}
    s2 := Student{"李四", 22}
    s3 := Student{"王五", 23}
    slice := []Student{s1, s2, s3}
    bs, err := json.Marshal(slice)
    if err != nil {
        panic(err)
    } else {
        fmt.Println(string(bs)) //[{"Name":"张三","Age":21},{"Name":"李四","Age":22},{"Name":"王五","Age":23}]
    }

    //map序列化为JSON
    var m = make(map[string]string)
    m["Go"] = "No.1"
    m["C++"] = "No.2"
    m["C"] = "No.3"
    m["C#"] = "No.4"
    if bs, err := json.Marshal(m); err != nil {
        panic(err)
    } else {
        fmt.Println(string(bs)) //{"C":"No.3","C#":"No.4","C++":"No.2","Go":"No.1"}
    }
    //JSON字段标签
    var p = &Person{
        Name:        "HZ",
        Age:         21,
        Gender:      true,
        Profile:     "from shandong",
        OmitContent: "OmitContent",
    }
    if bs, err := json.Marshal(p); err != nil {
        panic(err)
    } else {
        fmt.Println(string(bs))
    }

}

二、将json字符串解码到相应的数据结构

函数原型

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

•Unmarshal函数解析json编码的数据并将结果存入v指向的值。

•Unmarshal和Marshal做相反的操作,必要时申请映射、切片或指针。

将json字符串解码到相应的数据结构,Unmarshal的第一个参数是json字符串,第二个参数是接受json解析的数据结构。

demo

package main

import (
    "encoding/json"
    "fmt"
)

//Student 结构体
type Student struct {
    Name string
    Age  int
}

//Person JSON字段标签
type Person struct {
    Name        string `json:"username"` //自定义名称
    Age         int
    Gender      bool `json:",omitempty"` //如果该字段值为空,就不会输出到JSON串中
    Profile     string
    OmitContent string `json:"-"`       //字段不会输出到JSON
    Count       int    `json:",string"` //自定义名称
}

func main() {
    //结构体序列化为JSON
    s := Student{"黄哲", 20}
    bs1, err := json.Marshal(s);
    if err != nil {
        panic(err)
    } else {
        fmt.Println(string(bs1)) //{"Name":"黄哲","Age":20}
    }
    //JSON序列化为结构体
    var ss1 Student
    json.Unmarshal([]byte(bs1), &ss1)
    fmt.Println(ss1)

    //切片序列化为JSON
    s1 := Student{"张三", 21}
    s2 := Student{"李四", 22}
    s3 := Student{"王五", 23}
    slice := []Student{s1, s2, s3}
    bs2, err := json.Marshal(slice)
    if err != nil {
        panic(err)
    } else {
        fmt.Println(string(bs2)) //[{"Name":"张三","Age":21},{"Name":"李四","Age":22},{"Name":"王五","Age":23}]
    }
    //JSON序列化为切片
    slice1 := []Student{}
    json.Unmarshal([]byte(bs2), &slice1) //JSON转为切片第一个参数为json,转换为byte切片,第二个要保存到地址的引用
    fmt.Println(slice1)

    //map序列化为JSON
    var m = make(map[string]string)
    m["Go"] = "No.1"
    m["C++"] = "No.2"
    m["C"] = "No.3"
    m["C#"] = "No.4"
    bs3, err := json.Marshal(m)
    if err != nil {
        panic(err)
    } else {
        fmt.Println(string(bs3)) //{"C":"No.3","C#":"No.4","C++":"No.2","Go":"No.1"}
    }
    //JSON序列化为map
    var m1 = make(map[string]string)
    json.Unmarshal([]byte(bs3), &m1)
    fmt.Println(slice1)

    //JSON字段标签
    var p = &Person{
        Name:        "HZ",
        Age:         21,
        Gender:      true,
        Profile:     "from shandong",
        OmitContent: "OmitContent",
    }
    if bs, err := json.Marshal(p); err != nil {
        panic(err)
    } else {
        fmt.Println(string(bs))
    }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Math Adventures with Python

Math Adventures with Python

Peter Farrell / No Starch Press / 2018-11-13 / GBP 24.99

Learn math by getting creative with code! Use the Python programming language to transform learning high school-level math topics like algebra, geometry, trigonometry, and calculus! In Math Adventu......一起来看看 《Math Adventures with Python》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

MD5 加密
MD5 加密

MD5 加密工具