设为首页 加入收藏

TOP

golang-Json编码解码(一)
2019-08-04 00:08:20 】 浏览:30
Tags:golang-Json 编码 解码

在线工具:https://www.json.cn

一. 类型映射

  • golang和json的数据类型不一致,在编码或解码的过程中必然需要做类型映射。

1.从golang到json:

golang json
bool Boolean
int、float等数字 Number
string String
[]byte(base64编码) String
struct Object,再递归打包
array/slice Array
map Object
interface{} 按实际类型转换
nil null
channel,func UnsupportedTypeError

2.从json到golang:

json golang
Boolean bool
Number float64
String string
Array []interface{}
Object map[string]interface{}
null nil


二. 输出控制

  • 第一个标签为别名,后面控制标签可叠加。
  • 编码或解码的中间数据状态为字节数组
type User struct {
   Name string `json:"user_name"` //修改别名
   Age uint8 `json:",string"` //修改类型
   Addr string `json:"-"` //忽略字段
   Vip bool `json:",omitempty"` //排除缺省值
   Asset int64 `json:"amount,string,omitempty"` //标签叠加
   Skill []string `json:"skill"` //复杂类型
}

func main() {
   obj :=User{Name:"tom",Age:18,Addr:"BJ",Vip:false,Asset:888,Skill:[]string{"golang","python"}}
   bts, _ := json.MarshalIndent(obj,"","\t") //缩进
   fmt.Println(string(bts))
}


三. 类型编码

1.结构体/结构体指针: 映射为Object

func main() {
   obj := struct {A string;B int64}{"a", 1}
   bts, _ := json.Marshal(obj) //结构体
   fmt.Println(string(bts))

   ptr := &obj //结构体指针
   bts, _ = json.Marshal(ptr)
   fmt.Println(string(bts))
}

2.数组/切片: 映射为Array

func main() {
   arr := []string{"a","b","c"}
   bts, _ := json.Marshal(arr) 
   fmt.Println(string(bts))
}

3.字典: 映射为Object

func main() {
   mp := map[int]string{1:"a",2:"b",3:"c"}
   bts, _ := json.Marshal(mp)
   fmt.Println(string(bts))
}


四. 类型解码

1.对象解码

func main() {
   str := `{"A":"a","B":1}`
   obj := new(struct {A string;B int64})
   _ = json.Unmarshal([]byte(str), &obj )
   fmt.Println(obj)
}

2.数组解码

func main() {
   arr := `["a","b","c"]`

   slise:=make([]string,0)
   _ = json.Unmarshal([]byte(arr),&slise)
   fmt.Println(slise)
}

3.字典解码

func main() {
   str := `{"1":"a","2":"b","3":"c"}`

   mp := make(map[int]string)
   _ = json.Unmarshal([]byte(str), &mp)
   fmt.Println(mp)
}


五. 输出重写

  • Marshal函数将会递归遍历整个对象,并根据类型数据的MarshalJSON方法打印输出格式。
//自定义的Json时间格式
type Jtime time.Time

//实现了encoding/json/encode.go的Marshaler接口
func (p Jtime) MarshalJSON() ([]byte, error) {
   var stamp = fmt.Sprintf("%d", time.Time(p).Unix())
   //var stamp = fmt.Sprintf("\"%s\"", time.Time(p).Format("2006-01-02 15:04:05"))
   return []byte(stamp), nil
}

func main() {
   obj := struct {
      Name string `json:"nick_name"`
      Date Jtime `json:"create_at"`
   }{"Jack", Jtime(time.Date(2018, 1, 1, 00, 00, 00, 00, time.Local))}

   //编码
   bts, _ := json.MarshalIndent(obj, "", "\t")
   fmt.Println(string(bts))

   //解码
   _ = json.Unmarshal(bts, obj)
   fmt.Printf("%s %q", obj.Name, time.Time(obj.Date))
}


六. 扩展功能

1. Json格式验证:json.Valid()

func main() {
   str := `{"nick_name":"Lucy","user_age":28}` //Object
   str = `["a","b"]` //Ar  
		
编程开发网
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇基于go语言结合微信小程序开发的.. 下一篇golang module 下载外网资源失败..