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 编码解码的更多相关文章

  1. PHP json编码遇到的问题

    今天遇到了json编码解码之后中文消失的问题,一探究竟,写下这篇文章 PHP中提供了json_encode  和json_decode 这对函数 将PHP中 值转化成 字符串,但是遇到中文的时候,很容 ...

  2. [转]Golang Gob编码

    Golang Gob编码 2012-08-24 09:47 by 轩脉刃, 5119 阅读, 1 评论, 收藏, 编辑 gob是Golang包自带的一个数据结构序列化的编码/解码工具.编码使用Enco ...

  3. Golang JSON操作汇总

    直接把结构体编码成json数据 package main import ( "encoding/json" "fmt" _ "os" ) t ...

  4. golang-Json编码解码

    目录 一. 类型映射 二. 输出控制 三. 类型编码 四. 类型解码 五. 输出重写 六. 扩展功能 七. Bson编码 在线工具:https://www.json.cn 一. 类型映射 golang ...

  5. 理解netty对protocol buffers的编码解码

    一,netty+protocol buffers简要说明 Netty是业界最流行的NIO框架之一优点:1)API使用简单,开发门槛低:2)功能强大,预置了多种编解码功能,支持多种主流协议:3)定制能力 ...

  6. iOS  Emoji表情编码/解码

    之前做弹幕的时候 遇到的表情编码解码问题 表情编码一般是使用unicode编码 ,编码之后的格式 \ud83d\ude18\ud83d\ude18world\u4e16\u754chaha\ud83d ...

  7. 在JavaScript中使用json.js:使得js数组转为JSON编码

    在json的官网中下载json.js,然后在script中引入,以使用json.js提供的两个关键方法. 1.数组对象.toJSONString() 这个方法将返回一个JSON编码格式的字符串,用来表 ...

  8. Go语言标准库之JSON编解码

    Go语言标准库之JSON编解码 基本的类型 Go语言中的数据类型和JSON的数据类型的关系 bool -> JSON boolean float64 -> JSON numbers str ...

  9. 网络编程 -- RPC实现原理 -- Netty -- 迭代版本V3 -- 编码解码

    网络编程 -- RPC实现原理 -- 目录 啦啦啦 V2——Netty -- pipeline.addLast(io.netty.handler.codec.MessageToMessageCodec ...

随机推荐

  1. 笨办法学Python - 习题11-12: Asking Questions & Prompting People

    目录 1.习题 11: 提问 2.习题 12: 提示别人 3.总结 1.习题 11: 提问 学习目标:了解人机交互场景,熟悉raw_input 的用法. 1.在 Python2.x 中 raw_inp ...

  2. [译文]c#扩展方法(Extension Method In C#)

    原文链接: https://www.codeproject.com/Tips/709310/Extension-Method-In-Csharp 介绍 扩展方法是C# 3.0引入的新特性.扩展方法使你 ...

  3. OO学习体会与阶段总结(测试与论证)

    前言   随着期末的到来,对于面向对象程序设计课程的学习也迎来了尾声.在最后一个月的从课程中,笔者对于面向对象程序规格实现层面的单元测试.正确性论证以及使用UML图描述程序的设计进行了深入的学习.通过 ...

  4. c# 写文件注意问题及用例展示

    以txt写string举例,正确代码如下: private void xie() { FileStream fs = new FileStream("1.txt", FileMod ...

  5. 网络助手之NABCD

    Sunny--Code团队:刘中睿,杜晓松,郑成       我们小组这次做的软件名字叫为校园网络助手.它主要有着两项功能:网络助手与校内网盘.          N--need:在学校里有时候我们就 ...

  6. 《TCP/IP 详解 卷1:协议》第 2 章:Internet 地址结构

    第二章介绍 Internet 使用的网络层地址,即熟知的 IP 地址.连接到 Internet 的设备,基于 TCP/IP 的专用网络中使用的设备都需要一个 IP 地址. 路由器(见 IP 协议 一章 ...

  7. Linux(Red hat)无网离线安装TensorFlow

    文件下载 首先,下载想要安装的版本,目前最新的是1.8.0 根据你的python版本下载对应的whl文件,下载连接:https://pypi.org/project/tensorflow/#files ...

  8. js 代码几种方式

    var nameSpace={ //public } (function(){ //private })(); var module=(function(){ //private return { / ...

  9. cobbler-web 界面技术详解

    cobbler-web安装配置过程详解 (1)安装cobbler-web(测试时候,确保物理网络是在内网中进行,在外网会无法访问的哦,cobbler-web的访问入口必须有dhcpd指定的网络保持一致 ...

  10. Internet History, Technology and Security (Week 6)

    Week 6 Technology: Transport Control Protocol (TCP) Welcome to Week 6 of IHTS. We are in our second ...