golang json 编码解码

golang  "encoding/json"包实现了json对象的编解码

一、编码

func Marshal(v interface{}) ([]byte, error)

Marshal函数使用下面的基于类型的默认编码格式:

布尔类型编码为json布尔类型。

浮点数、整数和Number类型的值编码为json数字类型。

字符串编码为json字符串。角括号"<"和">"会转义为"\u003c"和"\u003e"以避免某些浏览器吧json输出错误理解为HTML。基于同样的原因,"&"转义为"\u0026"。

数组和切片类型的值编码为json数组,但[]byte编码为base64编码字符串,nil切片编码为null。

结构体的值编码为json对象。每一个导出字段变成该对象的一个成员

Example:

 1 package main
 2
 3 import(
 4     "fmt"
 5     "encoding/json"
 6 )
 7 func main() {
 8     type User struct{
 9         Name string
10         Age int
11     }
12     user := User{
13         Name:"tom",
14         Age:3,
15     }
16     b, err := json.Marshal(user)
17     if err != nil {
18         fmt.Println("json Marshal fail:", err)
19     }
20     fmt.Println(string(b))
21 }

Output:

{"Name":"tom","Age":3}

1 不可导出字段,不会被编码

Example:

type User struct{
        Name string
        age int
    }
    user := User{
        Name:"tom",
        age:3,
    }
    b, _ := json.Marshal(user)
    fmt.Println(string(b))

Output:

{"Name":"tom"}

2 可通过结构体标签,改变编码的json对象

Example:

type User struct{
        Name string `json:"name"`
        Age int     `json:"ageeeeeeeeeeeeeeeeee"`
    }
    user := User{
        Name:"tom",
        Age:3,
    }
    b, _ := json.Marshal(user)
    fmt.Println(string(b))

Output:

{"name":"tom","ageeeeeeeeeeeeeeeeee":3}

3 复杂结构体编码:

   指针编码为它指向的值

   切片编码为数组

   结构体的值编码为json对象

Example:

    // 复杂结构体编码
    //基本类型指针,结构体指针,切片,切片指针,
    type Contact struct {
        Addr string
        Phone string
    }

    type User struct {
        Name string
        Age *int
        C1 *Contact
        C2 []Contact
        C3 []*Contact
    }
    age := 20
    c1 := Contact{"北京","12345"}
    cArr := [...]Contact{Contact{"北京","11111"},Contact{"深圳","22222"},Contact{"上海","33333"}}
    c2 := cArr[:2]
    c3 := make([]*Contact,0)
    c3 = append(c3, &cArr[0])
    c3 = append(c3, &cArr[1])

    user := User{
        Name:    "Tom",
        Age:     &age,
        C1:      &c1,
        C2:      c2,
        C3:      c3,
    }
    fmt.Printf("struct: %v\n", user)
    b, _ := json.Marshal(user)
    fmt.Println("json: ", string(b))

Output:

struct: {Tom 0xc04204a1c8 0xc042044580 [{北京 11111} {深圳 22222}] [0xc042086000 0xc042086020]}
json:  {"Name":"Tom","Age":20,"C1":{"Addr":"北京","Phone":"12345"},"C2":[{"Addr":"北京","Phone":"11111"},{"Addr":"深圳","Phone":"22222"}],"C3":[{"Addr":"北京","Phone":"11111"},{"Addr":"深圳","Phone":"22222"}]}

二、解码

func Unmarshal(data []byte, v interface{}) error

Example

//json解码 测试
    type Contact struct {
        Addr string
        Phone string
    }

    type User struct {
        Name string
        Age *int
        C1 *Contact
        C2 []Contact
        C3 []*Contact
    }

    user := User{}
    j := `{
                "Name": "Tom",
                "Age": 20,
                "C1": {
                    "Addr": "北京",
                    "Phone": "12345"
                },
                "C2": [{
                    "Addr": "北京",
                    "Phone": "11111"
                }, {
                    "Addr": "深圳",
                    "Phone": "22222"
                }],
                "C3": [{
                    "Addr": "北京",
                    "Phone": "11111"
                }, {
                    "Addr": "深圳",
                    "Phone": "22222"
                }]
            }`
    err := json.Unmarshal([]byte(j), &user)
    if err != nil {
        fmt.Println("json Unmarshal fail!")
    }
    fmt.Printf("%v\n", user)
    fmt.Println(*user.Age)
    fmt.Println(*user.C1)
    fmt.Println(*user.C3[0])

Output

{Tom 0xc04204a3a8 0xc0420447a0 [{北京 11111} {深圳 22222}] [0xc042044860 0xc042044880]}
20
{北京 12345}
{北京 11111}

参考: Go语言标准库文档中文版

原文地址:https://www.cnblogs.com/fhb2011/p/8975184.html

时间: 2024-11-05 16:27:41

golang json 编码解码的相关文章

[转]Golang Gob编码

Golang Gob编码 2012-08-24 09:47 by 轩脉刃, 5119 阅读, 1 评论, 收藏, 编辑 gob是Golang包自带的一个数据结构序列化的编码/解码工具.编码使用Encoder,解码使用Decoder.一种典型的应用场景就是RPC(remote procedure calls). gob和json的pack之类的方法一样,由发送端使用Encoder对数据结构进行编码.在接收端收到消息之后,接收端使用Decoder将序列化的数据变化成本地变量. 有一点需要注意, 发送

golang-Json编码解码

目录 一. 类型映射 二. 输出控制 三. 类型编码 四. 类型解码 五. 输出重写 六. 扩展功能 七. Bson编码 在线工具:https://www.json.cn 一. 类型映射 golang和json的数据类型不一致,在编码或解码的过程中必然需要做类型映射. 1.从golang到json: golang json bool Boolean int.float等数字 Number string String []byte(base64编码) String struct Object,再递

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

网络编程 -- RPC实现原理 -- 目录 啦啦啦 V2--Netty -- pipeline.addLast(io.netty.handler.codec.MessageToMessageCodec<INBOUND_IN, OUTBOUND_IN>) 覆写编码解码方法. pipeline相当于拦截器.在pipeline中添加MessageToMessageCodec接口的实现类,该接口的实现类中的encode()方法自动将发送的Object对象转换为ByteBuf,decode()方法自动将

自定义协议的编码解码

2015.4.1 wqchen. 转载请注明出处 http://www.cnblogs.com/wqchen/p/4385798.html 本文介绍的是一个自定义协议的编码解码工具的实现. 游戏开发中,前端后端协议一般都会协商定制通信协议的格式,统一格式后用程序脚本对应前端和后端的编程语言,分别生成一份协议的编码和解码方案,便于协议的一致性. 这样的工具有很多,比较出名的是google的protobuf,它可以支持很多种编程语言.我也曾试用过protobuf,看过一点它的实现,protobuf完

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

在json的官网中下载json.js,然后在script中引入,以使用json.js提供的两个关键方法. 1.数组对象.toJSONString() 这个方法将返回一个JSON编码格式的字符串,用来表示类型中的数据. 演示: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"

理解netty对protocol buffers的编码解码

一,netty+protocol buffers简要说明 Netty是业界最流行的NIO框架之一优点:1)API使用简单,开发门槛低:2)功能强大,预置了多种编解码功能,支持多种主流协议:3)定制能力强,可以通过ChannelHandler对通信框架进行灵活的扩展:4)性能高,通过与其它业界主流的NIO框架对比,Netty的综合性能最优:5)成熟.稳定,Netty修复了已经发现的所有JDK NIO BUG,业务开发人员不需要再为NIO的BUG而烦恼:6)社区活跃,版本迭代周期短,发现的BUG可以

golang json处理struct未导出成员

我们用golang的json来marshal一个结构体的时候,结构体的未导出的成员将无法被json访问,也就是不会出现json编码的结果里(也就是小写的成员没法导出) 这个是由于技术的上问题引起的:golang的结构体里的成员的名字如果以小写字母开头,那么其他的包是无法访问的,也就是json无法访问我们的结构体里小写字母开头的成员 这个可以有两种方法解决 1. struct的成员用大写开头,然后加tag 2. 实现json.Marshaler接口 第一种方法比较常见这儿就不详细展开了 第二种方法

PHP 汉字 特殊字符 UNICODE 编码 解码 高性能简洁实现方案

网上,针对汉字.特殊字符的UNICODE 编码.解码实现,方法诸多,但是大多是复制粘贴,没有新意! PHP UNICODE 汉字 编码: var_dump(json_encode('2018 ABC 我是中国人!网站:http://my.oschina.net/cart/')); 上述就实现了PHP中对汉字.特殊字符的 UNICODE 编码! 多么easy! 上面会输出: string(96) ""2018 ABC \u6211\u662f\u4e2d\u56fd\u4eba\uff0

iOS &#160;Emoji表情编码/解码

之前做弹幕的时候 遇到的表情编码解码问题 表情编码一般是使用unicode编码 ,编码之后的格式 \ud83d\ude18\ud83d\ude18world\u4e16\u754chaha\ud83d\ude17 //编码 NSString *uniStr = [NSString stringWithUTF8String:[_barrageText.text UTF8String]]; NSData *uniData = [uniStr dataUsingEncoding:NSNonLossyA