go语言中的json与map相互转换实现

主要是引入 "encoding/json" 包;用到的也就是其中的两个函数json.Marshal和json.Unmarshal。

1、json.Marshal

#函数定义位于GOROOT or GOPATH的/src/encoding/json/encode.go 中

func Marshal(v interface{}) ([]byte, error) {
        e := newEncodeState()

        err := e.marshal(v, encOpts{escapeHTML: true})
        if err != nil {
                return nil, err
        }
        buf := append([]byte(nil), e.Bytes()...)

        encodeStatePool.Put(e)

        return buf, nil
}

2、json.Unmarshal

#函数定义位于GOROOT or GOPATH的/src/encoding/json/decode.go 中

func Unmarshal(data []byte, v interface{}) error {
        // Check for well-formedness.
        // Avoids filling out half a data structure
        // before discovering a JSON syntax error.
        var d decodeState
        err := checkValid(data, &d.scan)
        if err != nil {
                return err
        }

        d.init(data)
        return d.unmarshal(v)
}

#输入的数据类型是[]byte,string类型的话要转成[]byte.
str1 := "hello"
data := []byte(str1)  // 将字符串转为[]byte类型

可见其输入数据的类型是[]byte。对于string类型的数据要转成[]byte类型才可以。

// 当前程序的包名
package main

// 导入其它的包
import (
    "encoding/json"
    "fmt"
)

func main() {
    map2json2map()
}

func map2json2map() {

    map1 := make(map[string]interface{})
    map1["1"] = "hello"
    map1["2"] = "world"
    //return []byte
    str, err := json.Marshal(map1)

    if err != nil {
        fmt.Println(err)
    }
    fmt.Println("map to json", string(str))

    //json([]byte) to map
    map2 := make(map[string]interface{})
    err = json.Unmarshal(str, &map2)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println("json to map ", map2)
    fmt.Println("The value of key1 is", map2["1"])
}

到此这篇关于go语言中的json与map相互转换实现的文章就介绍到这了,更多相关go json与map相互转换内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • golang struct, map, json之间的相互转换

    本文用于记录我在 golang 学习阶段遇到的类型转换问题,针对的是 json .map.struct 之间相互转换的问题,用到的技术 json .mapstructure.reflect 三个类库 公共代码区域 package main import ( "encoding/json" "fmt" "testing" ) type UserInfoVo struct { Id string `json:"id"` UserN

  • golang 实现struct、json、map互相转化

    一.Json和struct互换 (1)Json转struct例子: package main import ( "fmt" "encoding/json" ) type People struct { Name string `json:"name_title"` Age int `json:"age_size"` } func JsonToStructDemo(){ jsonStr := ` { "name_tit

  • Golang map如何生成有序的json数据详解

    前言 本文主要给大家介绍了关于Golang map生成有序json数据的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 先来看一段 Golang 生成 json 的代码,首先定义了一个 map[string]interface{}  的变量,然后存一些值,这里要注意的是 previews 字段,为了浏览器获取到的 json 数据是有序的,所以定义了一个 map[int]map[string]string 的类型,加上了一个表示顺序的键: list := make(map[strin

  • go语言中的json与map相互转换实现

    主要是引入 "encoding/json" 包:用到的也就是其中的两个函数json.Marshal和json.Unmarshal. 1.json.Marshal #函数定义位于GOROOT or GOPATH的/src/encoding/json/encode.go 中 func Marshal(v interface{}) ([]byte, error) { e := newEncodeState() err := e.marshal(v, encOpts{escapeHTML: t

  • 详解 Go 语言中 Map 类型和 Slice 类型的传递

    Map 类型 先看例子 m1: func main() { m := make(map[int]int) mdMap(m) fmt.Println(m) } func mdMap(m map[int]int) { m[1] = 100 m[2] = 200 } 结果是 map[2:200 1:100] 我们再修改如下 m2: func main() { var m map[int]int mdMap(m) fmt.Println(m) } func mdMap(m map[int]int) {

  • 浅析R语言中map(映射)与reduce(规约)

    map(映射)与reduce(规约)操作在数据处理中非常常见,R语言的核心是向量化操作,自带的apply系列函数完成了数据框的向量化计算,而purrr包中的map与reduce系列函数很好的拓展了向量化计算,使R语言处理数据更加优雅流畅. purrr包是tidyverse系列中的包,开发者是大名鼎鼎的Hadley Wickham.purrr包中的函数很多,使用最多的是map与reduce系列函数. 安装包 install.packages('purrr') map map表示映射,可以在一个或多

  • go语言中slice,map,channl底层原理

    目录 0. 前序 1. slice 1.1 slice的创建 1.2 数据结构 1.3 扩容机制 2. map 2.1 map创建 2.2 数据结构 2.3 扩容机制 3. channl 3.1 数据结构 3.2 过程详解 0. 前序 slice,map,channl是我们Go语言中最最常用的几个数据结构,对于这些做到知根知底,对于我们建立知识体系以及优化代码都有着很重要的意义,所以本文,我们深入这三个数据结构的底层,剖析其设计思想. 1. slice 1.1 slice的创建 slice的创建

  • Go语言中map使用和并发安全详解

    目录 1 map使用 1.1 map定义 1.2 map的使用和概念 1.3 map的容量 1.4 map的使用 1.4.1 map的遍历 1.4.2 map的删除和断言 1.5 map的坑 2 并发安全 2.1 不安全原因 2.2 解决方案 总结 1 map使用 1.1 map定义 map是一种无序的集合,对应的key (索引)会对应一个value(值),所以这个结构也称为关联数组或字典. map在其他语言中hash.hash table等 var mapname map[keytype]va

  • 一文带你深入探究Go语言中的sync.Map

    目录 1. Map 的基本实现原理 2. sync.Map 的实现原理 2.1 sync.Map 的结构体定义 2.2 sync.Map 的读取实现 2.3 sync.Map 的写入实现 2.4 sync.Map 的删除实现 2.5 sync.Map 的遍历实现 在 Go 语言中,有一个非常实用的并发安全的 Map 实现:sync.Map,它是在 Go 1.9 版本中引入的.相比于标准库中的 map,它的最大特点就是可以在并发情况下安全地读写,而不需要加锁.在这篇博客中,我们将深入探讨 sync

  • go语言中http超时引发的事故解决

    前言 我们使用的是golang标准库的http client,对于一些http请求,我们在处理的时候,会考虑加上超时时间,防止http请求一直在请求,导致业务长时间阻塞等待. 最近同事写了一个超时的组件,这几天访问量上来了,网络也出现了波动,造成了接口在报错超时的情况下,还是出现了请求结果的成功. 分析下具体的代码实现 type request struct { method string url string value string ps *params } type params stru

  • Go语言中的range用法实例分析

    本文实例讲述了Go语言中的range用法.分享给大家供大家参考.具体如下: for 循环的 range 格式可以对 slice 或者 map 进行迭代循环. 复制代码 代码如下: package main import "fmt" var pow = []int{1, 2, 4, 8, 16, 32, 64, 128} func main() {     for i, v := range pow {         fmt.Printf("2**%d = %d\n"

  • 浅析Go语言中的Range关键字

    前言 相信用过Range的朋友们都知道,Go语言中的range关键字使用起来非常的方便,它允许你遍历某个slice或者map,并通过两个参数(index和value),分别获取到slice或者map中某个元素所在的index以及其值. 比如像这样的用法: for index, value := range mySlice { fmt.Println("index: " + index) fmt.Println("value: " + value) } 上面的例子足够

  • Go语言中slice作为参数传递时遇到的一些“坑”

    前言 相信看到这个题目,可能大家都觉得是一个老生常谈的月经topic了.一直以来其实把握一个"值传递"基本上就能理解各种情况了,不过最近遇到了更深一点的"小坑",与大家分享一下. 首先还是从最简单的说起,看下面代码: func main() { a := []int{7,8,9} fmt.Printf("len: %d cap:%d data:%+v\n", len(a), cap(a), a) ap(a) fmt.Printf("le

随机推荐