golang json
来源:互联网 发布:大数据在博客 编辑:程序博客网 时间:2024/06/03 23:01
json 的struct、array、map、str转换
package mainimport ( "encoding/json" "fmt" "os")type ConfigStruct struct { Host string `json:"host"` Port int `json:"port"` AnalyticsFile string `json:"analytics_file"` StaticFileVersion int `json:"static_file_version"` StaticDir string `json:"static_dir"` TemplatesDir string `json:"templates_dir"` SerTcpSocketHost string `json:"serTcpSocketHost"` SerTcpSocketPort int `json:"serTcpSocketPort"` Fruits []string `json:"fruits"`}type Other struct { SerTcpSocketHost string `json:"serTcpSocketHost"` SerTcpSocketPort int `json:"serTcpSocketPort"` Fruits []string `json:"fruits"`}func main() { jsonStr := `{"host": "http://localhost:9090","port": 9090,"analytics_file": "","static_file_version": 1,"static_dir": "E:/Project/goTest/src/","templates_dir": "E:/Project/goTest/src/templates/","serTcpSocketHost": ":12340","serTcpSocketPort": 12340,"fruits": ["apple", "peach"]}` //json str 转map var dat map[string]interface{} if err := json.Unmarshal([]byte(jsonStr), &dat); err == nil { fmt.Println("==============json str 转map=======================") fmt.Println(dat) fmt.Println(dat["host"]) } //json str 转struct var config ConfigStruct if err := json.Unmarshal([]byte(jsonStr), &config); err == nil { fmt.Println("================json str 转struct==") fmt.Println(config) fmt.Println(config.Host) } //json str 转struct(部份字段) var part Other if err := json.Unmarshal([]byte(jsonStr), &part); err == nil { fmt.Println("================json str 转struct==") fmt.Println(part) fmt.Println(part.SerTcpSocketPort) } //struct 到json str if b, err := json.Marshal(config); err == nil { fmt.Println("================struct 到json str==") fmt.Println(string(b)) } //map 到json str fmt.Println("================map 到json str=====================") enc := json.NewEncoder(os.Stdout) enc.Encode(dat) //array 到 json str arr := []string{"hello", "apple", "python", "golang", "base", "peach", "pear"} lang, err := json.Marshal(arr) if err == nil { fmt.Println("================array 到 json str==") fmt.Println(string(lang)) } //json 到 []string var wo []string if err := json.Unmarshal(lang, &wo); err == nil { fmt.Println("================json 到 []string==") fmt.Println(wo) }}
StructTag
如果希望手动配置结构体的成员和JSON字段的对应关系,可以在定义结构体的时候给成员打标签:
使用omitempty熟悉,如果该字段为nil或0值(数字0,字符串”“,空数组[]等),则打包的JSON结果不会有这个字段。
type Message struct { Name string `json:"msg_name"` // 对应JSON的msg_name Body string `json:"body,omitempty"` // 如果为空置则忽略字段 Time int64 `json:"-"` // 直接忽略字段}var m = Message{ Name: "Alice", Body: "", Time: 1294706395881547000,}data, err := json.Marshal(m)if err != nil { fmt.Printf(err.Error()) return}fmt.Println(string(data))Output:{"msg_name":"Alice"}
使用json.RawMessage
json.RawMessage其实就是[]byte类型的重定义。可以进行强制类型转换。使用json.RawMessage的话,Args字段在Unmarshal时不会被解析,直接将字节数据赋值给Args。我们可以能先解包第一层的JSON数据,然后根据Cmd的值,再确定Args的具体类型进行第二次Unmarshal。
这里要注意的是,一定要使用指针类型*json.RawMessage,否则在Args会被认为是[]byte类型,在打包时会被打包成base64编码的字符串。
现在有这么一种场景,结构体中的其中一个字段的格式是未知的:
type Command struct { ID int Cmd string Args *json.RawMessage}
使用interface{}
interface{}类型在Unmarshal时,会自动将JSON转换为对应的数据类型:
JSON的boolean 转换为bool
JSON的数值 转换为float64
JSON的字符串 转换为string
JSON的Array 转换为[]interface{}
JSON的Object 转换为map[string]interface{}
JSON的null 转换为nil
需要注意的有两个。一个是所有的JSON数值自动转换为float64类型,使用时需要再手动转换为需要的int,int64等类型。第二个是JSON的object自动转换为map[string]interface{}类型,访问时直接用JSON Object的字段名作为key进行访问。再不知道JSON数据的格式时,可以使用interface{}。
自定义类型
如果希望自己定义对象的打包解包方式,可以实现以下的接口:
type Marshaler interface { MarshalJSON() ([]byte, error)}type Unmarshaler interface { UnmarshalJSON([]byte) error}
实现该接口的对象需要将自己的数据打包和解包。如果实现了该接口,json在打包解包时则会调用自定义的方法,不再对该对象进行其他处理。
- Golang Json
- golang json
- golang 处理Json 数组
- golang的json操作
- golang JSON读文件
- golang解析json格式
- golang json 处理
- golang json array转码
- golang json数组拼接
- golang and json
- golang--json使用笔记
- golang json格式化输出
- Golang 基础 JSON
- goLang 复杂json解析
- golang json 封装包
- golang的json操作
- golang json处理
- golang的JSON处理
- Spring+Hibernate动态切换数据源以及失败解决方案
- input框的class属性为form-control,怎么去调边框和阴影
- Android发送POST请求上传图片后台解析本地一片黑问题
- easyui根据部门业务员显示可用的日期
- 关于QTableWidget常见错误
- golang json
- Spring Cloud构建微服务架构:Hystrix监控面板【Dalston版】
- xss的用法
- Elasticsearch学习笔记(二) mysql数据同步
- 4-16译码器
- VC++信息安全编程(13)Windows2000/xp/vista/7磁盘扇区读写技术
- learn more study less:如何高效学习
- 洛谷P2984 [USACO10FEB]给巧克力Chocolate Giving
- xgboost如何传入稀疏矩阵加快训练(利用scipy sparse模块)