Go语言标准库之JSON编解码

基本的类型

Go语言中的数据类型和JSON的数据类型的关系

  • bool -> JSON boolean
  • float64 -> JSON numbers
  • string -> JSON strings
  • nil -> JSON null
Struct to JSON

Goencoding/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文件

Goencoding/json中的json.Decoderjson.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编解码的更多相关文章

  1. json编解码

    [elk@zjtest7-frontend test]$ cat json.conf input { stdin { } } filter { json{ source =>"mess ...

  2. Nodejs进阶:服务端字符编解码&乱码处理

    写在前面 在web服务端开发中,字符的编解码几乎每天都要打交道.编解码一旦处理不当,就会出现令人头疼的乱码问题. 不少从事node服务端开发的同学,由于对字符编码码相关知识了解不足,遇到问题时,经常会 ...

  3. 转: gob编解码

    要让数据对象能在网络上传输或存储,我们需要进行编码和解码.现在比较流行的编码方式有JSON,XML等.然而,Go在gob包中为我们提供了另一种方式,该方式编解码效率高于JSON.gob是Golang包 ...

  4. NodeJS学习笔记 进阶 (1)Nodejs进阶:服务端字符编解码&乱码处理(ok)

    个人总结:这篇文章主要讲解了Nodejs处理服务器乱码及编码的知识,读完这篇文章需要10分钟. 摘选自网络 写在前面 在web服务端开发中,字符的编解码几乎每天都要打交道.编解码一旦处理不当,就会出现 ...

  5. 企业级工作流解决方案(七)--微服务Tcp消息传输模型之消息编解码

    Tcp消息传输主要参照surging来做的,做了部分裁剪和改动,详细参见:https://github.com/dotnetcore/surging Json-rpc没有定义消息如何传输,因此,Jso ...

  6. Python 下JSON的两种编解码方式实例解析

    概念   JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写.在日常的工作中,应用范围极其广泛.这里就介绍python下它的两种编解码方法: ...

  7. Emoji表情编解码库XXL-EMOJI

    <Emoji表情编解码库XXL-EMOJI> 一.简介 1.1 概述 XXL-EMOJI 是一个灵活可扩展的Emoji表情编解码库,可快速实现Emoji表情的编解码. 1.2 特性 1.简 ...

  8. libavcodec是一款LGPL自由软件编解码库,用于视频和音频数据的编解码工作

    http://zh.wikipedia.org/zh-cn/Libavcodec http://baike.baidu.com/view/856526.htm libavcodec是一款LGPL自由软 ...

  9. 玩node-images模块---Node.js轻量级跨平台图像编解码库

    Node.js轻量级跨平台图像编解码库 github:https://github.com/zhangyuanwei/node-images Features 功能特性 轻量级:无需安装任何图像处理库 ...

随机推荐

  1. autoperfixer 版本配置

    { "private": true, "dependencies": { "autoprefixer": "^9.3.1" ...

  2. day34 并发编程之生产者消费者模型 队列

    1.守护进程(了解) """ 守护进程 表示 一个进程b 守护另一个进程a 当被守护的进程a结束后 那么b也跟着结束了 就像 皇帝驾崩 妃子殉葬 应用场景 之所以开启子进 ...

  3. 9.22 keep studying

    项目要换用element组件了. element [http://element.eleme.io/1.4/#/zh-CN]是饿了么前端出品的一套基于Vue2.0的组件库,今天看了一下,确实简单好看. ...

  4. pythone函数基础(10)MD5加密

    导入hashlib模块import hashlibs='yulin123456's.encode()#把数字转换成bytes类型m=hashlib.md5(s.encode())print(m.hex ...

  5. 47-java 排列组合

    import java.util.HashSet; public class Main1 { public static int ys = 0; public static int ys2 = 0; ...

  6. 记录一次Centos磁盘空间占满的解决办法(转)

    原文地址:https://blog.csdn.net/everything1209/article/details/70209157 解决前 磁盘使用情况: 第二块磁盘使用率达到97% [root@f ...

  7. node.js中path路径模块的使用

    path模块是node.js中处理路径的核心模块.可以很方便的处理关于文件路径的问题. join() 将多个参数值合并成一个路径 const path = require('path'); conso ...

  8. ELK+SpringBoot+Logback离线安装及配置

    ELK+SpringBoot+Logback 离线安装及配置 版本 v1.0 编写时间 2018/6/11 编写人 xxx     目录 一. ELK介绍2 二. 安装环境2 三. Elasticse ...

  9. AES-GCM算法

    一.简介 http://blog.csdn.net/t0mato_/article/details/53160772

  10. ES之五:ElasticSearch聚合

    前言 说完了ES的索引与检索,接着再介绍一个ES高级功能API – 聚合(Aggregations),聚合功能为ES注入了统计分析的血统,使用户在面对大数据提取统计指标时变得游刃有余.同样的工作,你在 ...