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 功能特性 轻量级:无需安装任何图像处理库 ...
随机推荐
- 《CSAPP》页表、页命中、缺页
页表 虚拟存储器系统需要某种方法来判定一个虚拟页是否在DRAM的某个地方. 这些功能由操作系统.存储器管理单元(MMU)中的地址翻译硬件和一个存放在物理存储器中的页表数据结构联合提供. 功能 将虚拟页 ...
- 初学c# -- c#创建开机自启服调用外部交互式exe文件
在c#创建的开机自启动服务里,调用外部可执行文件有以下问题:1.带窗口的交互式的exe文件调用后,实际并没有被执行:2.服务是随windows启动的,服务启动后可能windows桌面还没出来,会报错误 ...
- Python设计模式 - 基础 - 七大基本原则
提倡使用设计模式,主要出发点就是实现代码复用,增加代码的扩展性和可维护性.如何设计出简洁.易懂.灵活.优美的代码结构的确是一门学问,透彻理解并践行如下七大原则通常都能取得基本满意的结果: - 单一职责 ...
- 166. Fraction to Recurring Decimal (Math)
Given two integers representing the numerator and denominator of a fraction, return the fraction in ...
- Curator的cluster,实现多节点数据共享
模拟两个客户端,实现多节点数据共享 package bjsxt.curator.cluster; import org.apache.curator.RetryPolicy; import org.a ...
- Django的rest_framework的权限组件和频率组件源码分析
前言: Django的rest_framework一共有三大组件,分别为认证组件:perform_authentication,权限组件:check_permissions,频率组件:check_th ...
- Mobile Computing: the Next Decade论文 cloudlet薄云
1 Introduction “Information at your fingertips anywhere, anytime” has been the driving vision of mob ...
- [leetcode]22. Generate Parentheses生成括号
Given n pairs of parentheses, write a function to generate all combinations of well-formed parenthes ...
- stark组件开发之编辑功能实现
编辑功能.和添加一样! 唯一不同的就是, 需要编辑一个指定的 记录.这就需要,在列表页面, 渲染编辑的时候,添加一个 id 值: class UserInfoHandler(StartHandler ...
- tiny4412 --uboot移植(2) 点灯
开发环境:win10 64位 + VMware12 + Ubuntu14.04 32位 工具链:linaro提供的gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-g ...