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