Go语言学习之JSON编码解析与使用

目录
  • 1.Map转JSON
  • 2. Json转Map
  • 3.结构体转JSON
    • 3.1 无字段标签
    • 3.2 有字段标签
    • 3.3 匿名字段
  • 4.JSON转结构体
  • 5.切片转JSON
  • 6.JSON转切片

1.Map转JSON

package main
import (
    "encoding/json"
    "fmt"
)
func main()  {
    // map里面
    map1 := map[string]string {
        "name":"张三",
        "age":"18",
        "home":"北京",
    }
    // 将map解析成json
    json1, err := json.Marshal(map1)
    if err != nil {
        fmt.Println(err.Error())
    }
    fmt.Printf("json1: %s  类型: %T \n",json1,json1)

    map2 := map[string][]string {
        "fruit": {"香蕉","葡萄"},
        "coder":{"PHP","Go","Java"},
        "likes":{"打游戏","看动漫"},
    }
    json2, err := json.Marshal(map2)
    if err != nil {
        fmt.Println(err.Error())
    }
    fmt.Printf("json2: %s  类型: %T \n",json2,json2)
}
/**输出
json1: {"age":"18","home":"北京","name":"张三"}  类型: []uint8
json2: {"coder":["PHP","Go","Java"],"fruit":["香蕉","葡萄"],"likes":["打游戏","看动漫"]}  类型: []uint8
*/

2. Json转Map

package main
import (
    "encoding/json"
    "fmt"
)
func main()  {
    json1 := `{"age":"18","home":"北京","name":"张三"}`
    map1 := make(map[string]string)
    err := json.Unmarshal([]byte(json1), &map1)
    if err != nil {
        fmt.Println(err.Error())
    }
    fmt.Printf("map1: %v T: %T\n",map1,map1)

    json2 := `{"coder":["PHP","Go","Java"],"fruit":["香蕉","葡萄"],"likes":["打游戏","看动漫"]}`
    map2 := make(map[string][]string)
    err = json.Unmarshal([]byte(json2), &map2)
    if err != nil {
        fmt.Println(err.Error())
    }
    fmt.Printf("map2: %v T: %T\n",map2,map2)
}
/**输出
map1: map[age:18 home:北京 name:张三] T: map[string]string
map2: map[coder:[PHP Go Java] fruit:[香蕉 葡萄] likes:[打游戏 看动漫]] T: map[string][]string
*/

3.结构体转JSON

3.1 无字段标签

结构体转换成JSON在开发中经常会用到。encoding/json包是通过反射机制来实现编解码的,<font color=red>因此结构体必须导出所转换的字段,没有导出的字段不会被encoding/json包解析。</font>

package main
import (
    "encoding/json"
    "fmt"
)
type Student struct {
    Name string
    Age int
    Class string
    phone string //小写字段,则不是会导出
}
func main()  {
    s := Student{
        Name:  "张三",
        Age:   17,
        Class: "三年级",
        phone: "17600112222",
    }
    json1, err := json.Marshal(s)
    if err != nil {
        fmt.Println(err.Error())
    }
    fmt.Printf("json: %s \n",json1)
}
// 输出 json: {"Name":"张三","Age":17,"Class":"三年级"}

3.2 有字段标签

json包在解析结构体时,如果遇到keyJSON的字段标签,则会按照一定规则解析该标签。

package main
import (
    "encoding/json"
    "fmt"
)
// 定义一个学生结构体
type Student struct {
    Name  string `json:"_name"` // 字段标签的语法
    Age   int    `json:"_age"`
    Class string `json:"-"` // 不解析
    Phone string `json:"phone"`
    Score float32 // 没有标签时,则用字段名
}
func main()  {
    s := Student{
        Name:  "张三",
        Age:   17,
        Class: "三年级",
        Phone: "17600112222",
        Score: 88.5,
    }
    json1, err := json.Marshal(s)
    if err != nil {
        fmt.Println(err.Error())
    }
    fmt.Printf("json: %s \n",json1)
}
// 输出-> json: {"_name":"张三","_age":17,"phone":"17600112222","Score":88.5}

1.规则总结

  • 有标签名时,标签名会作为key
  • 没有标签时,则会使用字段名。
  • 有标签名时,但是标签名的值为-,则不会导出

3.3 匿名字段

json包在解析匿名字段时,会将匿名字段的字段当成该结构体的字段处理。

package main
import (
    "encoding/json"
    "fmt"
)
type Student struct {
    Name  string `json:"_name"`
    Age   int    `json:"_age"`
    Top // 匿名字段
}
type Top struct {
    Sort int `json:"sort"`
    Score float64
    Class string
}
func main()  {
    s := Student{
        Name: "张三",
        Age:  18,
        Top:  Top{1,99.5,"一年级"},
    }
    json1, err := json.Marshal(s)
    if err != nil {
        fmt.Println(err.Error())
    }
    fmt.Printf("json: %s \n",json1)
}
//输出-> json: {"_name":"张三","_age":18,"sort":1,"Score":99.5,"Class":"一年级"}

4.JSON转结构体

JSON可以转换成结构体。同编码一样,json包是通过反射机制来实现解码的,因此结构体必须导出所转换的字段,不导出的字段不会被json包解析。另外解析时不区分大小写。

package main
import (
    "encoding/json"
    "fmt"
)
type Student struct {
    Name  string `json:"_name"`
    Age   int    `json:"_age"`
    Top // 匿名字段
}
type Top struct {
    Sort int `json:"sort"`
    Score float64
    Class string
}
func main(){
    student := Student{}
    js := `{"_name":"张三","_age":18,"sort":1,"Score":99.5,"Class":"一年级"}`
    err := json.Unmarshal([]byte(js), &student)
    if err != nil {
        fmt.Println(err.Error())
    }
    fmt.Printf("v: %+v  t: %T \n",student,student)
}
// 输出: v: {Name:张三 Age:18 Top:{Sort:1 Score:99.5 Class:一年级}}  t: main.Student

5.切片转JSON

package main
import (
    "encoding/json"
    "fmt"
)
func main(){
    student := []string {
        "张三",
        "李四",
        "小米",
    }
    marshal, err := json.Marshal(student)
    if err != nil {
        fmt.Println(err.Error())
    }
    fmt.Printf("v :%s T:%T",marshal,marshal)
}
// 输出 v :["张三","李四","小米"] T:[]uint8

6.JSON转切片

package main
import (
    "encoding/json"
    "fmt"
)
func main(){
    json1 := `["张三","李四","小米"]`
    var sc []string
    err := json.Unmarshal([]byte(json1), &sc)
    if err != nil {
        fmt.Println(err.Error())
    }
    fmt.Printf("v :%v T:%T",sc,sc)
}
// 输出: v :[张三 李四 小米] T:[]string

以上就是Go语言学习之JSON编码解析与使用的详细内容,更多关于Go语言JSON的资料请关注我们其它相关文章!

(0)

相关推荐

  • 使用Go语言解析动态JSON格式的方法

    通常使用Golang encoding/json 标准库可以方便的编码/解析JSON数据,但是前提需要定义struct数据结构.特别是解析未知结构的JSON数据时,原有方法很难满足需求了,本文主要介绍动态解析JSON格式. Go语言的JSON 库 Go语言自带的JSON转换库为 encoding/json 1.1)其中把对象转换为JSON的方法(函数)为 json.Marshal(),其函数原型如下 func Marshal(v  interface{}) ([]byte, error) 也就是

  • Go语言实现JSON解析的方法详解

    目录 1.json序列化 2.Json反序列化为结构体对象 3.Json反序列化为map类型 4.Tag的使用 在日常项目中,使用Json格式进行数据封装是比较常见的操作,看一下golang怎么实现. 1.json序列化 将json字符串转为go语言结构体对象. package main import ( "encoding/json" "errors" "fmt" ) var parseJsonError = errors.New("

  • Go中JSON解析时tag的使用

    目录 struct成员变量标签(Tag)说明 struct成员变量标签(Tag)获取 自定义tag 在处理json格式字符串的时候,经常会看到声明struct结构的时候,属性的右侧还有反引号括起来的内容.形如: type User struct { UserId int `json:"user_id" bson:"user_id"` UserName string `json:"user_name" bson:"user_name&qu

  • Golang实现解析JSON的三种方法总结

    目录 背景 示例Json 例子 解释 1)反序列化成map 2)反序列化成对象 3)复杂json的解析 总结 背景 这是一篇写给0-1年新人的文章,短平快的教会你如何解析json字符串. 示例Json 假设有如下json字符串: { "userName":"admin", "nick_name":"管理员", "info":{ "age":18 }, "extra":

  • Golang 如何解析和生成json

    JSON(Javascript Object Notation)是一种轻量级的数据交换语言,以文字为基础,具有自我描述性且易于让人阅读.尽管JSON是JavaScript的一个子集,但JSON是独立于语言的文本格式,并且采用了类似于C语言家族的一些习惯.JSON与XML最大的不同在于XML是一个完整的标记语言,而JSON不是.JSON由于比XML更小.更快,更易解析,以及浏览器的內建快速解析支持,使得其更适用于网络数据传输领域. Golang自带的JSON解析库encoding/json,可以用

  • golang生成JSON以及解析JSON

    目录 一.JSON解析到结构体 1.JSON名称/值对 2.JSON值 3.JSON数据 4.JSON对象 5.JSON数组 6.JSON布尔值 7.JSON null 二.JSON转map 三.生成JSON 一.JSON解析到结构体 在介绍这部分之前先简要介绍一下Json语法 JSON 语法是 JavaScript 语法的子集.JSON 语法是 JavaScript 对象表示法语法的子集. 数据在名称/值对中 数据由逗号分隔 大括号保存对象 中括号保存数组 1.JSON名称/值对 "name&

  • Go语言学习之JSON编码解析与使用

    目录 1.Map转JSON 2. Json转Map 3.结构体转JSON 3.1 无字段标签 3.2 有字段标签 3.3 匿名字段 4.JSON转结构体 5.切片转JSON 6.JSON转切片 1.Map转JSON package main import ( "encoding/json" "fmt" ) func main() { // map里面 map1 := map[string]string { "name":"张三"

  • go语言通过结构体生成json示例解析

    目录 通过结构体生成json 通过map生成json json解析到结构体 json解析到map 通过结构体生成json buf, err := json.MarshalIndent(s, "", " ") //格式化编码 package main import ( "encoding/json" "fmt" ) //成员变量名首字母必须大写 type IT struct { Company string `json:&quo

  • Go语言json编码驼峰转下划线、下划线转驼峰的实现

    一.需求 golang默认的结构体json转码出来,都是根据字段名生成的大写驼峰格式,但是一般我们最常用的json格式是小写驼峰或者小写下划线,因此,我们非常需要一个统一的方法去转换,而不想挨个写json标签,例如 package main import ( "encoding/json" "fmt" ) func main() { type Person struct { HelloWold string LightWeightBaby string } var

  • OpenMV与JSON编码问题解析

    目录 JSON ujson – JSON编码与解码 Python生成JSON 常用函数 生成JSON字符串 解析JSON字符串 解析JSON对象 JSON 如果想快速尝试两个单片机通信的.推荐使用串口传输json字符串! JSON是一种简洁高效的交换数据的格式. 它可以是这种简单的: "[[12,0],[10,12],[22,10],[99,11]]" 注:我通过这种简单的字符串,把OpenMV中的色块的x,y坐标发送出去. 也可以是这种复杂的:在python中表示多行字符串: '''

  • javascript学习之json入门

    1. 什么是JSON JSON---Javascript Object Notation,前两个单词大家应该都认识,最后一个notation,是"记号.标记法"的意思,连在一起,便成了JSON. 它是一种轻量级的数据交换格式,是基于Javascript的一个子集,可以叫做Javascript对象表示法,是存储和交换文本信息的语法,但它并不是Javascript独有的数据格式,其它很多语言都可以对JSON进行解析和序列化. 2. JSON的由来 在21世纪初,Douglas Crockf

  • 深入理解Python对Json的解析

    Json简介 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等).这些特性使JSON成为理想的数据交换语言.易于人阅读和编写,同时也易于机器解析和生成. 它

  • 10分钟掌握XML、JSON及其解析

    引言 NOKIA 有句著名的广告语:"科技以人为本".任何技术都是为了满足人的生产生活需要而产生的.具体到小小的一个手机,里面蕴含的技术也是浩如烟海,是几千年来人类科技的结晶,单个人穷其一生也未必能掌握其一角.不过个人一直认为基本的技术和思想是放之四海而皆准的,许多技术未必需要我们从头到尾再研究一遍,我们要做的就是站在巨人的肩膀上,利用其成果来为人们的需求服务. 随着移动互联网时代的大潮,越来越多的App不光是需要和网络服务器进行数据传输和交互,也需要和其他 App 进行数据传递.承担

  • Go语言学习教程之结构体的示例详解

    目录 前言 可导出的标识符 嵌入字段 提升 标签 结构体与JSON相互转换 结构体转JSON JSON转结构体 练习代码步骤 前言 结构体是一个序列,包含一些被命名的元素,这些被命名的元素称为字段(field),每个字段有一个名字和一个类型. 结构体用得比较多的地方是声明与数据库交互时需要用到的Model类型,以及与JSON数据进行相互转换.(当然,项目中任何需要多种数据结构组合在一起使用的地方,都可以选择用结构体) 代码段1:声明一个待办事项的Model类型: type Todo struct

  • Android 中对JSON数据解析实例代码

    Android 中对JSON数据解析 在Android的网络编程中,JSON是比XML使用更为广泛的数据传输机制.在许多的http网络请求或接口调用中,返回的很多都是JSON.所以学会解析JSON是学会Android的基本技能. 简单介绍下JSON,JSON是轻量级的文本数据交换格式,独立于语言和平台.比XML更小,更快,更易解析.JSON是用键值对来保存数据的.JSON保存的值可以是数字.字符串.布尔值.数组和对象. 废话少说,直接上代码.下面对以下JOSN进行解析: { "language&

  • 在Go语言中使用JSON的方法

    Encode 将一个对象编码成JSON数据,接受一个interface{}对象,返回[]byte和error: func Marshal(v interface{}) ([]byte, error) Marshal函数将会递归遍历整个对象,依次按成员类型对这个对象进行编码,类型转换规则如下: bool类型 转换为JSON的Boolean 整数,浮点数等数值类型 转换为JSON的Number string 转换为JSON的字符串(带""引号) struct 转换为JSON的Object,

随机推荐