Go语言标准库之JSON编解码
Go语言标准库之JSON编解码
基本的类型
Go语言中的数据类型和JSON的数据类型的关系
- bool -> JSON boolean
- float64 -> JSON numbers
- string -> JSON strings
- nil -> JSON null
Struct to JSON
Go包encoding/json中的json.Marshal方法,可以将struct编码为JSON数据
package main
import (
"encoding/json"
"fmt"
"time"
)
type FruitBasket struct {
Name string
Fruit []string
Id int64 `json:"ref"`
private string // 这个字段不会被编码
Created time.Time
}
func main() {
basket := FruitBasket{
Name: "Standard",
Fruit: []string{"Apple", "Banana", "Orange"},
Id: 999,
private: "Second-rate",
Created: time.Now(),
}
jsonData, err := json.Marshal(basket)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(jsonData))
}
输出结果
{"Name":"Standard","Fruit":["Apple","Banana","Orange"],"ref":999,"Created":"2019-01-01T11:40:05.9885387+08:00"}
- 只有
public字段才能被导出 json:tag可以定义导出字段的名称- nil导出为
null
格式化输出
可以使用 json.MarshalIndent方法来格式化输出的JSON数据
formatData, err := json.MarshalIndent(basket, "", " ")
fmt.Println(string(formatData))
格式化输出结果是
{
"Name": "Standard",
"Fruit": [
"Apple",
"Banana",
"Orange"
],
"ref": 999,
"Created": "2019-01-01T11:45:49.0969176+08:00"
}
JSON to Struct
Go包中json.Unmarshal方法,解析 JSON数据
jsonStr := []byte(`
{
"Name": "Standard",
"Fruit": [
"Apple",
"Banana",
"Orange"
],
"ref": 999,
"Created": "2019-01-01T11:45:49.0969176+08:00"
}
`)
var basketStruct FruitBasket
err = json.Unmarshal(jsonStr, &basketStruct)
if err != nil {
log.Println(err)
}
fmt.Println(basketStruct.Name, basketStruct.Fruit)
fmt.Println(basketStruct.Created)
输出结果是
Standard [Apple Banana Orange]
2019-01-01 11:45:49.0969176 +0800 CST
编码格式化任意类型的对象和数组
map[string]interface{}可以编码任意类型的 JSON 对象
[]interface{}可以编码任意类型的JSON数组
arbitData := []byte(`{"Name":"Eve","Age":6,"Parents":["Alice","Bob"]}`)
var v interface{}
err = json.Unmarshal(arbitData, &v)
if err != nil {
log.Println(err)
}
data := v.(map[string]interface{})
for k, v := range data {
switch v := v.(type) {
case string:
fmt.Println(k, v, "(string)")
case float64:
fmt.Println(k, v, "(float64)")
case []interface{}:
fmt.Println(k, v, "(array)")
for i, u := range v {
fmt.Println(" ", i, u)
}
default:
fmt.Println(k, v, "(unknown)")
}
}
输出结果是
Name Eve (string)
Age 6 (float64)
Parents [Alice Bob] (array)
0 Alice
1 Bob
编解码JSON文件
Go中encoding/json中的json.Decoder和json.Encoder方法可以编解码JSON格式文件
例子:
jsonstr := `
{"Name": "Alice", "Age": 25}
{"Name": "Bob", "Age": 22}`
reader := strings.NewReader(jsonstr)
writer := os.Stdout
dec := json.NewDecoder(reader)
enc := json.NewEncoder(writer)
for {
var m map[string]interface{}
if err := dec.Decode(&m); err == io.EOF {
break
} else if err != nil {
log.Fatal(err)
}
for k := range m {
if k == "Age" {
delete(m, k)
}
}
if err = enc.Encode(&m); err != nil {
log.Println(err)
}
}
输出结果是
{"Name":"Alice"}
{"Name":"Bob"}
Go语言标准库之JSON编解码的更多相关文章
- json编解码
[elk@zjtest7-frontend test]$ cat json.conf input { stdin { } } filter { json{ source =>"mess ...
- Nodejs进阶:服务端字符编解码&乱码处理
写在前面 在web服务端开发中,字符的编解码几乎每天都要打交道.编解码一旦处理不当,就会出现令人头疼的乱码问题. 不少从事node服务端开发的同学,由于对字符编码码相关知识了解不足,遇到问题时,经常会 ...
- 转: gob编解码
要让数据对象能在网络上传输或存储,我们需要进行编码和解码.现在比较流行的编码方式有JSON,XML等.然而,Go在gob包中为我们提供了另一种方式,该方式编解码效率高于JSON.gob是Golang包 ...
- NodeJS学习笔记 进阶 (1)Nodejs进阶:服务端字符编解码&乱码处理(ok)
个人总结:这篇文章主要讲解了Nodejs处理服务器乱码及编码的知识,读完这篇文章需要10分钟. 摘选自网络 写在前面 在web服务端开发中,字符的编解码几乎每天都要打交道.编解码一旦处理不当,就会出现 ...
- 企业级工作流解决方案(七)--微服务Tcp消息传输模型之消息编解码
Tcp消息传输主要参照surging来做的,做了部分裁剪和改动,详细参见:https://github.com/dotnetcore/surging Json-rpc没有定义消息如何传输,因此,Jso ...
- Python 下JSON的两种编解码方式实例解析
概念 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写.在日常的工作中,应用范围极其广泛.这里就介绍python下它的两种编解码方法: ...
- Emoji表情编解码库XXL-EMOJI
<Emoji表情编解码库XXL-EMOJI> 一.简介 1.1 概述 XXL-EMOJI 是一个灵活可扩展的Emoji表情编解码库,可快速实现Emoji表情的编解码. 1.2 特性 1.简 ...
- libavcodec是一款LGPL自由软件编解码库,用于视频和音频数据的编解码工作
http://zh.wikipedia.org/zh-cn/Libavcodec http://baike.baidu.com/view/856526.htm libavcodec是一款LGPL自由软 ...
- 玩node-images模块---Node.js轻量级跨平台图像编解码库
Node.js轻量级跨平台图像编解码库 github:https://github.com/zhangyuanwei/node-images Features 功能特性 轻量级:无需安装任何图像处理库 ...
随机推荐
- MSTP+ VRRP 交换机的 配置过程
配置思路采用以下思路配置: 1.在处于环形网络中的交换设备上配置MSTP基本功能,包括:a.配置MST域并创建多实例,配置VLAN2映射到MSTI1,VLAN3映射到MSTI2,实现流量的负载分担. ...
- CSS文本超出指定行数省略显示
单行: overflow: hidden; text-overflow: ellipsis; white-space: nowrap; 2行: font-size: 17px;overflow: hi ...
- windbg获取打印
经常有QT MFC程序调用动态库无法查看内部打印 解决办法: 文件头部定义: #define UseDebugView #ifdef UseDebugView char g_Debug[256]; # ...
- Python基础-python简介(一)
一.简介: python是一种面向对象的解释性计算机程序设计语言,由荷兰人Guido von Rossum于1989年的圣诞节发明. Python语言的特色: 1.python是一门解释性语言 解 ...
- Java18-java语法基础——集合框架
Java18-java语法基础——集合框架 一.什么是集合框架 1.集合框架:是为表示和操作集合而规定的一种统一的.标准的体系结构. 2.任何集合框架都包含三大块内容:对外的接口.接口的实现和对集合运 ...
- mybatis-plus 自动生成代码
public class MpGenerator { /** * <p> * MySQL 生成演示 * </p> */ public static void main(Stri ...
- ef core中使用code first
这个配置还是挺坑,照这个一步步做倒是可以 https://www.cnblogs.com/chenzhaoyu/p/7831980.html
- linux 查看信息-系统&资源
系统 1.查看内核/操作系统/CPU信息 2.查看操作系统版本 3.查看CPU信息 4.查看计算机名 5.列出所有PCI设备 6.列出所有的USB设备 7.列出加载的内核模块 8.查看环境变量 资源 ...
- hibernate的Could not execute JDBC batch update错误原因及处理
http://blog.csdn.net/derpvailzhangfan/article/details/2332795\ 上述问题: 一设置关联 二包含关键字 三 映射文件设置 catalog=“ ...
- Codeforces Round #486 (Div. 3) F. Rain and Umbrellas
Codeforces Round #486 (Div. 3) F. Rain and Umbrellas 题目连接: http://codeforces.com/group/T0ITBvoeEx/co ...