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 功能特性 轻量级:无需安装任何图像处理库 ...
随机推荐
- 学习日 day1
今天第一天开始写博客,希望以后能坚持,每天写,一是记录自己学习的历程,更重要的是复习每天学过的东西. 今天学习的内容:time模块的相关语法 导入方式 首行输入import time即可 time.t ...
- Java学习笔记(十二):java编译跨平台运行原理
class文件由java源代码通过javac编译器编译生成,只能为JVM所识别.
- 【Nodejs】Expressのサンプルについて
全体の実行命令: ①c:\workspace>node XXX.js ②ブラウザに「http://localhost:3000」を入力 ▲サンプル① ・ソース(express_demo.js) ...
- poj2115(扩展欧基里德定理)
题目链接:https://vjudge.net/problem/POJ-2115 题意:模拟for循环for(int i=A;i!=B;i+=C),且数据范围为k位无符号数以内,即0~1<< ...
- 小强学渲染之OpenGL的CPU管线
读到这里,应该对OpenGL渲染管线有了初步简单了解.下面着重分析CPU管线,即逻辑控制中心做了什么,这部分还是容易理解的.如下图: 一,将数据加载到显存中. 这是由GPU是访问显存中的数据决定的.因 ...
- python—切片
切片就是list取值的一种方式 l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] print(l[1:5]) #取值方式顾头不顾尾 print(l[:5]) #冒号 前面 没写代 ...
- (转)经验分享:CSS浮动(float,clear)通俗讲解
文章转自:https://www.cnblogs.com/iyangyuan/archive/2013/03/27/2983813.html 很早以前就接触过CSS,但对于浮动始终非常迷惑,可能是自身 ...
- 网络编程初识和socket套接字
网络的产生 不同机器上的程序要通信,才产生了网络:凡是涉及到倆个程序之间通讯的都需要用到网络 软件开发架构 软件开发架构的类型:应用类.web类 应用类:qq.微信.网盘.优酷这一类是属于需要安装的桌 ...
- python 06函数
python中函数定义方法: def test(x): "The function definitions" x+=1 return x def:定义函数的关键字test:函数名( ...
- centOS redis的安装及配置
1.下载redis的安装包 wget http://download.redis.io/releases/redis-4.0.2.tar.gz 我一般wget的文件都是在一个download的文件夹里 ...