序列化

序列化对象将使用 encoding/json 中的 Marshal 函数。

函数原型为:func Marshal(v interface{}) ([]byte, error)

以下是官网给出的例子:

package main

import (
"encoding/json"
"fmt"
"os"
) func main() {
type ColorGroup struct {
ID int
Name string
Colors []string
}
group := ColorGroup{
ID: 1,
Name: "Reds",
Colors: []string{"Crimson", "Red", "Ruby", "Maroon"},
}
b, err := json.Marshal(group)
if err != nil {
fmt.Println("error:", err)
}
os.Stdout.Write(b)
}

需要注意的是:json.Marshal返回了[]byte类型,通常情况下,需要将其转换为string类型使用。

反序列化

反序列化对象将使用 encoding/json 中的 Unmarshal 函数。

函数原型为:func Unmarshal(data []byte, v interface{}) error

以下是官网给出的例子:

package main

import (
"encoding/json"
"fmt"
) func main() {
var jsonBlob = []byte(`[
{"Name": "Platypus", "Order": "Monotremata"},
{"Name": "Quoll", "Order": "Dasyuromorphia"}
]`)
type Animal struct {
Name string
Order string
}
var animals []Animal
err := json.Unmarshal(jsonBlob, &animals)
if err != nil {
fmt.Println("error:", err)
}
fmt.Printf("%+v", animals)
}

在反序列化时,有可能不知道Json数据的具体类型,那应该怎么办呢?

其实,观察json.Unmarshal的函数原型可以看到,其第二个参数是一个interface。

事实上,你可以传入一个interface对象的指针,反序列化函数依然会填充这个对象。并且这个对象可以被转换成为map[string]interface{}这样的类型或者[]interface{}这样的类型,这取决于Json的内容。

于是,我们便有了在不知道Json数据具体类型的情况下,解析Json内容的方法。

代码如下:

package main

import (
"encoding/json"
"fmt"
) func main() {
var jsonBlob = []byte(`[
{"Name": "Platypus", "Order": "Monotremata"},
{"Name": "Quoll", "Order": "Dasyuromorphia"}
]`) var jsonObject interface{}
err := json.Unmarshal(jsonBlob, &jsonObject)
if err != nil {
fmt.Println("error:", err)
}
animals := jsonObject.([]interface{})
for i := 0; i < len(animals); i++ {
animalObject := animals[i]
animalMap := animalObject.(map[string]interface{})
fmt.Println(animalMap["Name"])
fmt.Println(animalMap["Order"])
}
}

如上,我们可以将反序列化出的对象,递归地进行类型转换,转换为[]interface{}或者map[string]interface{},这样就能一层层地解析Json的内容了。

当然,以上只是举例,证明可以通过一些手段解析未知结构的Json。为了正确解析未知结构的Json内容,你可能需要为解析过程添加一些判断,如解析出的对象的类型需要二选一,又如解析出的map类型中键的存在性等等。

在 golang 中使用 Json的更多相关文章

  1. [转]Golang 中使用 JSON 的小技巧

    taowen是json-iterator的作者. 序列化和反序列化需要处理JSON和struct的关系,其中会用到一些技巧. 原文 Golang 中使用 JSON 的小技巧是他的经验之谈,介绍了一些s ...

  2. Golang中解析json,构造json

    json解析是如今(网络)应用程序开发中最不可或缺的一环了.许多语言需要库支持才可以解析.构造json,但Golang凭借着原生库就可以很好地做到这一点. json的基本表现形式有两个:struct与 ...

  3. 『Golang』在Golang中使用json

    由于要开发一个小型的web应用,而web应用大部分都会使用json作为数据传输的格式,所以有了这篇文章. 包引用 import ( "encoding/json" "gi ...

  4. 在golang中使用json

    jsoniter高性能json库 非常快,支持java和go marshal使用的一些坑 package main import ( "encoding/json" "f ...

  5. Go实战--golang中使用JWT(JSON Web Token)

    http://blog.csdn.net/wangshubo1989/article/details/74529333 之前写过关于golang中如何使用cookie的博客: 实战–go中使用cook ...

  6. Go_14:GoLang中 json、map、struct 之间的相互转化

    1. golang 中 json 转 struct <1. 使用 json.Unmarshal 时,结构体的每一项必须是导出项(import field).也就是说结构体的 key 对应的首字母 ...

  7. GoLang中 json、map、struct 之间的相互转化

    1. golang 中 json 转 struct <1. 使用 json.Unmarshal 时,结构体的每一项必须是导出项(import field).也就是说结构体的 key 对应的首字母 ...

  8. golang中的reflect包用法

    最近在写一个自动生成api文档的功能,用到了reflect包来给结构体赋值,给空数组新增一个元素,这样只要定义一个input结构体和一个output的结构体,并填写一些相关tag信息,就能使用程序来生 ...

  9. Golang中的坑二

    Golang中的坑二 for ...range 最近两周用Golang做项目,编写web服务,两周时间写了大概五千行代码(业务代码加单元测试用例代码).用Go的感觉很爽,编码效率高,运行效率也不错,用 ...

随机推荐

  1. SQLServer:介质簇计数 缺失的介质簇序列号

    https://shiyousan.com/post/635886596017415485 http://www.cnblogs.com/yc-755909659/p/3725940.html 错误描 ...

  2. zip 与 unzip的简单使用

    先看help Copyright (c) - Info-ZIP - Type 'zip "-L"' for software license. Zip ). Usage: zip ...

  3. kali linux升级

    自己使用的是2017.2 版本的kali linux 想着升级一下 里面的包 比如msf 等 但是执行 msfupdate时提示 root@kali201702:~# msfupdate msfupd ...

  4. CSS 居中(拿来主义自用)

    居中是我们使用css来布局时常遇到的情况.使用css来进行居中时,有时一个属性就能搞定,有时则需要一定的技巧才能兼容到所有浏览器,本文就居中的一些常用方法做个简单的介绍. 注:本文所讲方法除了特别说明 ...

  5. Java之多线程(实现Runnable接口)

    package test_demo.ThreadsDemo; public class TestRunnable { public static void main(String[] args) { ...

  6. python之unittest单元测试

    # unittest单元测试 import unittest from class_demo import Car class TestCar(unittest.TestCase): '''测试Car ...

  7. maven dependcymanage作用在父类里面定义依赖包 子类不会自动继承需要主动使用 这样解决了父类引用任意包 子类就会引用的问题

    maven dependcymanage作用在父类里面定义依赖包 子类不会自动继承需要主动使用 这样解决了父类引用任意包 子类就会引用的问题  子类在引用时候 不需要加上版本号

  8. 一本通1585【例 1】Amount of Degrees

    1585: [例 1]Amount of Degrees 时间限制: 1000 ms         内存限制: 524288 KB 题目描述 原题来自:NEERC 2000 Central Subr ...

  9. G1收集器的收集原理

    G1收集器的收集原理 来源 http://blog.jobbole.com/109170/ JVM 8 内存模型 原文:https://blog.csdn.net/bruce128/article/d ...

  10. MT【223】二次函数最大最小

    若函数$f(x)=ax^2+20x+14(a>0)$对任意实数$t$,在闭区间$[t-1,t+1]$上总存在两实数$x_1,x_2$,使得$|f(x_1)-f(x_2)|\ge8$成立,则实数$ ...