golang json 编码解码
json 编码
package main import (
"encoding/json"
"fmt"
) type Person struct {
Name string `json:"name"`
Age int `json:"age"`
} func main() {
person := Person{"ruby", 24} b, err := json.Marshal(&person)
if err == nil {
fmt.Printf("%s\n", b)
} else {
// 错误处理
}
}
关键方法 json.Marshal:
func Marshal(v interface{}) ([]byte, error)
这个方法返回的结果是一个字节数组,如果需要转字符串,可以 string(xxx),如:
fmt.Println(string(b))
json 解码
package main import (
"encoding/json"
"strings"
"fmt"
) type Person struct {
Name string `json:"name"`
Age int `json:"age"`
} func main() {
// 需要解码的 json 字符串
str := `
{"name":"ruby","age":24}
` // json decoder 对象, 有个 Decode 方法, 接受一个 struct 参数
decoder := json.NewDecoder(strings.NewReader(str))
var person Person
err := decoder.Decode(&person)
if err == nil {
fmt.Println(person.Name)
fmt.Println(person.Age)
}
}
写成一行就是(str 是需要解码的字符串,v 是结构体变量,需要解码成什么 struct 就定义什么 struct 变量):
json.NewDecoder(strings.NewReader(str)).Decode(v)
总结:
json encode:
1、json.NewEncoder(<Writer>).encode(&v)
2、json.Marshal(&v)
json decode:
1、json.NewDecoder(<Reader>).decode(&v)
2、json.Unmarshal(&v)
下面是 all in one,几种方法的使用比较清晰:
package main import (
"encoding/json"
"fmt"
"bytes"
"strings"
) type Person struct {
Name string `json:"name"`
Age int `json:"age"`
} func main() {
// 1. 使用 json.Marshal 编码
person1 := Person{"张三", 24}
bytes1, err := json.Marshal(&person1)
if err == nil {
// 返回的是字节数组 []byte
fmt.Println("json.Marshal 编码结果: ", string(bytes1))
} // 2. 使用 json.Unmarshal 解码
str := `{"name":"李四","age":25}`
// json.Unmarshal 需要字节数组参数, 需要把字符串转为 []byte 类型
bytes2 := []byte(str) // 字符串转换为字节数组
var person2 Person // 用来接收解码后的结果
if json.Unmarshal(bytes2, &person2) == nil {
fmt.Println("json.Unmarshal 解码结果: ", person2.Name, person2.Age)
} // 3. 使用 json.NewEncoder 编码
person3 := Person{"王五", 30}
// 编码结果暂存到 buffer
bytes3 := new(bytes.Buffer)
_ = json.NewEncoder(bytes3).Encode(person3)
if err == nil {
fmt.Print("json.NewEncoder 编码结果: ", string(bytes3.Bytes()))
} // 4. 使用 json.NewDecoder 解码
str4 := `{"name":"赵六","age":28}`
var person4 Person
// 创建一个 string reader 作为参数
err = json.NewDecoder(strings.NewReader(str4)).Decode(&person4)
if err == nil {
fmt.Println("json.NewDecoder 解码结果: ", person4.Name, person4.Age)
}
}
常见问题:
1、为什么我定义了一个 struct,但是使用 json.Marshal 方法编码之后返回的是空的 byte[] ?
可能原因:struct 里面使用了小写的的字段名,如
type Person struct {
name string
age int
}
需要把 字段名转为 驼峰命名,如果需要编码之后的字段名是小写的,可以给 struct 加个 tag,如上面的例子那样 `json:"name"`
golang json 编码解码的更多相关文章
- PHP json编码遇到的问题
今天遇到了json编码解码之后中文消失的问题,一探究竟,写下这篇文章 PHP中提供了json_encode 和json_decode 这对函数 将PHP中 值转化成 字符串,但是遇到中文的时候,很容 ...
- [转]Golang Gob编码
Golang Gob编码 2012-08-24 09:47 by 轩脉刃, 5119 阅读, 1 评论, 收藏, 编辑 gob是Golang包自带的一个数据结构序列化的编码/解码工具.编码使用Enco ...
- Golang JSON操作汇总
直接把结构体编码成json数据 package main import ( "encoding/json" "fmt" _ "os" ) t ...
- golang-Json编码解码
目录 一. 类型映射 二. 输出控制 三. 类型编码 四. 类型解码 五. 输出重写 六. 扩展功能 七. Bson编码 在线工具:https://www.json.cn 一. 类型映射 golang ...
- 理解netty对protocol buffers的编码解码
一,netty+protocol buffers简要说明 Netty是业界最流行的NIO框架之一优点:1)API使用简单,开发门槛低:2)功能强大,预置了多种编解码功能,支持多种主流协议:3)定制能力 ...
- iOS Emoji表情编码/解码
之前做弹幕的时候 遇到的表情编码解码问题 表情编码一般是使用unicode编码 ,编码之后的格式 \ud83d\ude18\ud83d\ude18world\u4e16\u754chaha\ud83d ...
- 在JavaScript中使用json.js:使得js数组转为JSON编码
在json的官网中下载json.js,然后在script中引入,以使用json.js提供的两个关键方法. 1.数组对象.toJSONString() 这个方法将返回一个JSON编码格式的字符串,用来表 ...
- Go语言标准库之JSON编解码
Go语言标准库之JSON编解码 基本的类型 Go语言中的数据类型和JSON的数据类型的关系 bool -> JSON boolean float64 -> JSON numbers str ...
- 网络编程 -- RPC实现原理 -- Netty -- 迭代版本V3 -- 编码解码
网络编程 -- RPC实现原理 -- 目录 啦啦啦 V2——Netty -- pipeline.addLast(io.netty.handler.codec.MessageToMessageCodec ...
随机推荐
- 基于Neutron的Kubernetes SDN实践经验之谈
首先,向大家科普下Kubernetes所选择的CNI网络接口,简单介绍下网络实现的背景. CNI即Container Network Interface,是一套容器网络的定义规范,包括方法规范.参数规 ...
- 使用gdb和gdbserver调试Android C/C++程序
1,http://www.gnu.org/software/gdb/download/,下载最新版本的gdb源代码包,我使用的是gdb-7.6.tar.gz,使用tar命令进行解包(tar -xvzf ...
- Tomcat java zabbix 监控
排除汤姆猫错误的步骤 ps-ef | grep java或jps –lvm 查看java pid进程 netstat –lntup | grep java 查看java 端口有没有启动 查看 tomc ...
- Python入门学习系列——Python文件和异常
从文件中读取数据 首先准备一个文本文件,文件中存储着普通文本数据.读取文件需要调用open()和read()函数. 读取整个文件 代码示例: with open('pi_digits.txt') as ...
- [东北师大软工]Week2-作业2:个人项目实战 初步测试结果
作业地址 https://edu.cnblogs.com/campus/nenu/2016SE_NENU/homework/1656 测试须知 测试机为Windows环境,所有提交到Coding.ne ...
- 第10章 系统级I/O(下)
10.7 I/O重定向 Unix外壳提供了I/O重定向操作符,允许用户将磁盘文件和标准输出输入联系起来. 例如:unix>ls>foo.txt,使得外壳加载和执行ls程序,将标准输出重定 ...
- Spring笔记③--spring的命名空间
p:命名空间: xmlns:p="http://www.springframework.org/schema/p" 作用:简化在xml配置bean的属性 在<bean> ...
- 第三章 深入Servlet技术
3.1 配置Servlet <servlet-name>,<servlet-class>是必须配置的,以便于web容器知道浏览器具体访问的是哪个servlet. <ini ...
- C++编译与链接(2)-浅谈内部链接与外部链接
发现每次写技术博客时,都会在文章开头处花费一番功夫 ...从前,有一个程序员....他的名字叫magicsoar 为什么有时会出现aaa已在bbb中重定义的错误? 为什么有时会出现无法解析的外部符号? ...
- PAT 甲级 1143 Lowest Common Ancestor
https://pintia.cn/problem-sets/994805342720868352/problems/994805343727501312 The lowest common ance ...