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

posted @ 2019-11-07 03:17  jadeshu  阅读(158)  评论(0编辑  收藏  举报