golang生成JSON及解析JSON

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang生成JSON及解析JSON相关的知识,希望对你有一定的参考价值。

参考技术A 一、JSON解析到结构体

在介绍这部分之前先简要介绍一下Json语法

JSON 语法是 javascript 语法的子集。JSON 语法是 JavaScript 对象表示法语法的子集。

数据在名称/值对中

数据由逗号分隔

大括号保存对象

中括号保存数组

1.JSON名称/值对

2.JSON值

可以是:

JSON数据

JSON 数字可以是整型或者浮点型

JSON对象

JSON 对象在大括号()中书写:

对象可以包含多个名称/值对:

JSON数组

JSON 数组在中括号中书写:

数组可包含多个对象:

JSON布尔值

二、JSON转map

输出结果:

三、生成JSON

本文来自php中文网的 golang教程 栏目: https://www.php.cn/be/go/

(三十八)golang--json(对切片map结构体进行序列化)

JSON(javascript object notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。key-val

JSON是在2001年开始推广的数据格式,目前已成为主流的数据格式。

JSON易于机器解析和生成,并有效地提升网络传输效率。通常程序在网络传输时会先将数据(结构体、map)等序列化成json字符串,到接收方得到json数据时,再反序列化恢复成原来的数据类型。这种方式已成为各个语言的标准。

要解析成json格式,struct里面的字段必须大写!!!不然解析出来的是{}

因为Json包相当于一个外包,字段大写才能被其调用。。。

package main

import (
    "encoding/json"
    "fmt"
)

type monster struct {
    Name     string
    Age      int
    Birthday string
    Sal      float64
    Skill    string
}

func testStruct() {
    m := monster{
        Name:     "牛魔王",
        Age:      10,
        Birthday: "1994-09-18",
        Sal:      10000.0,
        Skill:    "牛魔拳",
    }
    //序列化
    data, err := json.Marshal(&m)
    if err != nil {
        fmt.Println("序列化失败,error=", err)
    }
    fmt.Printf("序列化之后的结果:%v\\n", string(data))
}

func testMap() {
    var a map[string]interface{}
    a = make(map[string]interface{})
    a["name"] = "孙悟空"
    a["age"] = 20
    a["address"] = "水帘洞"
    a["skill"] = "七十二变"
    data, err := json.Marshal(a)
    if err != nil {
        fmt.Println("序列化失败,error=", err)
    }
    fmt.Printf("序列化之后的结果:%v\\n", string(data))
}

func testSlice() {
    var slice []map[string]interface{}
    var m1 map[string]interface{}

    m1 = make(map[string]interface{})
    m1["name"] = "孙悟空"
    m1["age"] = 20
    m1["address"] = "水帘洞"
    m1["skill"] = [2]string{"七十二变", "如意金箍棒"}
    slice = append(slice, m1)
    var m2 map[string]interface{}

    m2 = make(map[string]interface{})
    m2["name"] = "猪八戒"
    m2["age"] = 30
    slice = append(slice, m2)
    data, err := json.Marshal(slice)
    if err != nil {
        fmt.Println("序列化失败,error=", err)
    }
    fmt.Printf("序列化之后的结果:%v\\n", string(data))
}

func testFloat64() {
    var a float64
    a = 0.987
    data, err := json.Marshal(a)
    if err != nil {
        fmt.Println("序列化失败,error=", err)
    }
    fmt.Printf("序列化之后的结果:%v\\n", string(data))
}

func main() {
    testStruct()
    testMap()
    testSlice()
    testFloat64()
}

要想序列化成小写的,只需要用tag指定即可:

 

对普通数据类型进行序列化是没意义的,只是相当于转换成string类型。 

 

以上是关于golang生成JSON及解析JSON的主要内容,如果未能解决你的问题,请参考以下文章

详解golang的json解析方法Marshal跟 Unmarshal(复杂的对象直接用神器生成对象)

go语言json处理

Golang解析json的特殊情况处理

golang学习之路—json

如何让golang 把变量解析为json,并输出为文件。

Golang ---json解析