Json的使用

Json的使用
1.JSON 语法是 JavaScript 语法的子集。JSON 语法是 JavaScript 对象表示法语法的子集。
2.编码
将一个Go语言中类似movies的结构体slice转为JSON的过程叫编组(marshaling)。编组通过调用json.Marshal | josn.marshalindent(编组带缩进)函数完成:
(1)编码解析:在编码中必须用到josn包,内部的marshal函数,
首先需要定义一个结构体
在结构体进行成员变量
主函数下进行进行变量的初始化
进行编组函数解析
打印出编码的内容
(2)在成员初始化中可以将大写变为小写的形式
package main

import (
“encoding/json”
“fmt”
)
//注意的问题:必须结构体变量名和内部成员变量名大写,否则无法打印出来
type IT struct {
Company string
Subjects []string
IsOk bool
Prise float64
}

func main() {
//定义变量名进行初始化
buf:=IT{
Company: “华南公司”,
Subjects: []string{“海鲜”,“日用品”,“服装”},
IsOk: true,
Prise: 100.555,
}
//注意编码中编组返回值有两个
// str,err:=json.Marshal(buf)
str,err:=json.MarshalIndent(buf,""," “)//展现的更加清晰
if err != nil {
fmt.Printf(”",err)
return
}
//打印时初始化值时切片必须string进行类型转换
fmt.Println(string(str))
}

输出的结果:
“company”: “华南公司”,
“Subjects”: [
“海鲜”,
“日用品”,
“服装”
],
“IsOk”: true,
“Prise”: 100.555
}
Process finished with exit code 0
4.struct_tag
在处理json格式字符串的时候,经常会看到声明struct结构的时候,属性的右侧还有小米点括起来的内容。形如
type User struct {
UserId int json:"user_id" bson:"user_id"
UserName string json:"user_name" bson:"user_name"
}

5.struct成员变量标签(Tag)说明
要比较详细的了解这个,要先了解一下golang的基础,在golang中,命名都是推荐都是用驼峰方式,并且在首字母大小写有特殊的语法含义:包外无法引用。但是由经常需要和其它的系统进行数据交互,例如转成json格式,存储到mongodb啊等等。这个时候如果用属性名来作为键值可能不一定会符合项目要求。

(2)在成员初始化中可以将大写变为小写的形式
在这里插入图片描述

第二种编码的方法用字典map来进行编码
注意:map中的类型为不同的类型用interface来做一个万能类型接口
package main

import (
“encoding/json”
“log”
)

func main() {
It:=make(map[string]interface{},4)
It[“Company”]=“华南公司”
It[“Subject”]=[]string{“海鲜”,“日用品”,“服装”}
It[“IsOk”]=true
It[“Prise”]=552.55

str,err:=json.MarshalIndent(It,""," “)
if err != nil {
log.Printf(”%+v\n",err)
return
}
log.Println(string(str))

}

4.解码
在json的解码过程中:1需要建立原来的结构体,2通过主函数下传入json表初始化,3然后通过定义一个变量属于原结构体变量类型,4通过json包下unmarshl函数进行解码,注意第一个参数为切片类型,第二个参数为取地址,同时返回一个参数为错误类型,5打印出解码的内容
package main

import (
“encoding/json”
“fmt”
“log”
)

type IT struct {
Company string
Subjects []string
IsOk bool
Prise float64
}

func main() {
//注意符号``
jsonBuf:={ "Company": "华南公司", "Subjects": [ "海鲜", "日用品", "服装" ], "IsOk": true, "Prise": 100.555 }
var tmp IT
err:=json.Unmarshal([]byte(jsonBuf),&tmp)、/第一个为切片类型,取地址传递
if err != nil {
fmt.Printf("%+v\n",err)
return
}
//log.Println(tmp)
log.Printf(“tmp=%+v\n”,tmp)

}
{华南公司 [海鲜 日用品 服装] true 100.555}
tmp={Company:华南公司 Subjects:[海鲜 日用品 服装] IsOk:true Prise:100.555}
5.map编码的解码方式
package main

import (
“encoding/json”
“fmt”
“log”
)

func main() {
jsonBuf:={ "Company": "华南公司", "Subjects": [ "海鲜", "日用品", "服装" ], "IsOk": true, "Prise": 100.555 }
tmp:=make(map[string]interface{},4)
err:=json.Unmarshal([]byte(jsonBuf),&tmp)
if err != nil {
fmt.Printf("%+v\n",err)
return
}
log.Println(tmp)
log.Printf(“tmp=%+v\n”,tmp)
}
6.类型断言来解决单独读取json文件中的内容
//类型断言
//var str string
for key, value:=range tmp{
switch data:=value.(type) {
case string:
//str=data
log.Printf(“map[%s]的值类型为string,value=%+v\n”,key,data)
case bool:
log.Printf(“map[%s]的值类型为bool,value=%+v\n”,key,data)
case float64:
log.Printf(“map[%s]的值类型为float64,value=%+v\n”,key,data)
case []interface{}:
log.Printf(“map[%s]的值类型为[]string,value=%+v\n”,key,data)
}
}
}

总结:结构体和map的解码方式对比:map的方式相对来说比较简单。