Go-Json操作

/**
 * @Author: jadeshu
 * @Description:
 * @File:  main
 * @Version: 1.0.0
 * @Date: 2019/11/7 2:33
 */
package main

import (
        "encoding/json"
        "fmt"
)

// 输出json 结构体中字段首字母必须大写
type person struct {
        //tag JSON中头字母变小写
        Name string `json:"name"`
        Age  int    `json:"age"`

        add int
        // tag 此字段bool类型转换为字符串输出
        Sex bool `json:",string"`
        // tag 此字段不会显示输出
        Sub []string `json:"-"`
}

func main() {
        p := person{"jadeshu", 1, 20, false, []string{"type1", "type2", "type3"}}

        //bytes, e := json.Marshal(p)
        // 格式化输出 方便查看
        bytes, e := json.MarshalIndent(p, "", "   ")
        if e != nil {
                fmt.Println(e.Error())
                return
        }
        fmt.Println(string(bytes))
        // end

        // ========通过map生成json文件
        // key:string val:任意类型
        m := make(map[string]interface{}, 10)
        m["name"] = "jadeshu"
        m["age"] = 12
        m["type"] = [3]string{"type1", "type2", "type3"}

        // 编码成JSON
        marshal, e := json.Marshal(m)
        if e != nil {
                fmt.Println(e.Error())
                return
        }

        fmt.Println(string(marshal))
        // end

        // JSON解析到结构体中
        jbuf := `{
                "first_name":"John",
                "last_name":"Doe",
                "age":20
        }`

        type pName struct {
                FirstName string `json:"first_name"`
                LastName  string `json:"last_name"`
                Age       int    `json:"age"`
        }
        var p1 pName
        json.Unmarshal([]byte(jbuf), &p1)
        fmt.Println(p1)
        // end

        // 只想读取JSON文件中的一个字段
        type pNamePart struct {
                LastName string `json:"last_name"`
        }

        var pPart pNamePart
        // 第二参数必须是指针
        json.Unmarshal([]byte(jbuf), &pPart) //传地址
        fmt.Println(pPart)
        // end

        // JSON解析到map中
        jmap := make(map[string]interface{}, 10)
        json.Unmarshal([]byte(jbuf), &jmap) //传地址
        fmt.Println(jmap)
        // end

        // 类型断言 判断
        for key, val := range jmap {
                switch data := val.(type) {
                case string:
                        fmt.Println("读取到字符串:", key, "--", data)
                case int:
                        fmt.Println("读取到整数型:", key, "--", data)
                case float64:
                        // 读取json转换为MAP后,整数变为浮点数
                        fmt.Println("读取到float64型:", key, "--", data)
                }
        }
}

运行结果:

{
   "name": "jadeshu",
   "age": 1,
   "Sex": "false"
}
{"age":12,"name":"jadeshu","type":["type1","type2","type3"]}
{John Doe 20}
{Doe}
map[age:20 first_name:John last_name:Doe]
读取到字符串: first_name -- John
读取到字符串: last_name -- Doe
读取到float32型: age -- 20

所有JSON数值类型一律解析为float64类型,需手动转换;对于map类型需判断是否为nil再转换为所需类型。

interface{}类型在json.Unmarshal时,会自动将JSON转换为对应的数据类型:

JSON的boolean 转换为bool

JSON的数值 转换为float64

JSON的字符串 转换为string

JSON的Array 转换为[]interface{}

JSON的Object 转换为map[string]interface{},也可以转为本身类型

JSON的null 转换为nil