Golang 语言中怎么解码 4 种常见JSON 格式数据?

01 介绍

工作中我们经常会遇到解码JSON格式的数据,本文通过4个示例介绍工作中常用到的四种 JSON格式。在 Golang语言中,通常是使用标准库的encoding/json包中的函数Unmarshal解码JSON格式的数据,下面我们先介绍一下该函数如何使用,再通过4个示例代码来演示一下如何在Golang中解码常见的4种JSON格式的数据。

02 func Unmarshal

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

Unmarshal函数解析json编码的数据并将结果存入v指向的值。

Unmarshal和Marshal做相反的操作,必要时申请映射、切片或指针,有如下的附加规则:

要将json数据解码写入一个指针,Unmarshal函数首先处理json数据是json字面值null的情况。此时,函数将指针设为nil;否则,函数将json数据解码写入指针指向的值;如果指针本身是nil,函数会先申请一个值并使指针指向它。

要将json数据解码写入一个结构体,函数会匹配输入对象的键和Marshal使用的键(结构体字段名或者它的标签指定的键名),优先选择精确的匹配,但也接受大小写不敏感的匹配。

要将json数据解码写入一个接口类型值,函数会将数据解码为如下类型写入接口:

bool, for JSON booleans
float64, for JSON numbers
string, for JSON strings
[]interface{}, for JSON arrays
map[string]interface{}, for JSON objects
nil for JSON null

如果一个JSON值不匹配给出的目标类型,或者如果一个json数字写入目标类型时溢出,Unmarshal函数会跳过该字段并尽量完成其余的解码操作。如果没有出现更加严重的错误,本函数会返回一个描述第一个此类错误的详细信息的UnmarshalTypeError。

JSON的null值解码为go的接口、指针、切片时会将它们设为nil,因为null在json里一般表示“不存在”。解码json的null值到其他go类型时,不会造成任何改变,也不会产生错误。

当解码字符串时,不合法的utf-8或utf-16代理(字符)对不视为错误,而是将非法字符替换为unicode字符U+FFFD。

03 普通 JSON

示例代码:

package main

import ( 'encoding/json' 'fmt')

// Actress 女演员type Actress struct { Name       string Birthday   string BirthPlace string Opus       []string}

func main() {

 // 普通JSON // 因为json.UnMarshal() 函数接收的参数是字节切片,所以需要把JSON字符串转换成字节切片。 jsonData := []byte(`{  'name':'迪丽热巴',  'birthday':'1992-06-03',  'birthPlace':'新疆乌鲁木齐市',  'opus':[   '《阿娜尔罕》',   '《逆光之恋》',   '《克拉恋人》'  ] }`)

 var actress Actress err := json.Unmarshal(jsonData, &actress) if err != nil {  fmt.Println('error:', err)  return } fmt.Printf('姓名:%s\n', actress.Name) fmt.Printf('生日:%s\n', actress.Birthday) fmt.Printf('出生地:%s\n', actress.BirthPlace) fmt.Println('作品:') for _, val := range actress.Opus {  fmt.Println('\t', val) }}

output:

姓名:迪丽热巴
生日:1992-06-03
出生地:新疆乌鲁木齐市
作品:
  《阿娜尔罕》
  《逆光之恋》
  《克拉恋人》

04 JSON 内嵌普通 JSON

示例代码:

package main

import ( 'encoding/json' 'fmt')// Opus 作品type Opus struct { Date string Title string}// Actress 女演员type Actress struct { Name       string Birthday   string BirthPlace string Opus       Opus}

func main () { // JSON嵌套普通JSON jsonData := []byte(`{  'name':'迪丽热巴',  'birthday':'1992-06-03',  'birthPlace':'新疆乌鲁木齐市',  'opus': {   'Date':'2013',   'Title':'《阿娜尔罕》'  } }`) var actress Actress err := json.Unmarshal(jsonData, &actress) if err != nil {  fmt.Println('error:', err)  return } fmt.Printf('姓名:%s\n', actress.Name) fmt.Printf('生日:%s\n', actress.Birthday) fmt.Printf('出生地:%s\n', actress.BirthPlace) fmt.Println('作品:') fmt.Printf('\t%s:%s', actress.Opus.Date, actress.Opus.Title)}

output:

姓名:迪丽热巴
生日:1992-06-03
出生地:新疆乌鲁木齐市
作品:
 2013:《阿娜尔罕》

05

JSON 内嵌数组 JSON

示例代码:

package main

import ( 'encoding/json' 'fmt')

type Opus struct { Date string Title string}type Actress struct { Name string Birthday string BirthPlace string Opus []Opus}

func main () { // JSON嵌套数组JSON jsonData := []byte(`{  'name':'迪丽热巴',  'birthday':'1992-06-03',  'birthPlace':'新疆乌鲁木齐市',  'opus':[   {    'date':'2013',    'title':'《阿娜尔罕》'   },   {    'date':'2014',    'title':'《逆光之恋》'   },   {    'date':'2015',    'title':'《克拉恋人》'   }  ] }`) var actress Actress err := json.Unmarshal(jsonData, &actress) if err != nil {  fmt.Println('error:', err)  return } fmt.Printf('姓名:%s\n', actress.Name) fmt.Printf('生日:%s\n', actress.Birthday) fmt.Printf('出生地:%s\n', actress.BirthPlace) fmt.Println('作品:') for _, val := range actress.Opus {  fmt.Printf('\t%s - %s\n', val.Date, val.Title) }}

output:

姓名:迪丽热巴
生日:1992-06-03
出生地:新疆乌鲁木齐市
作品:
 2013 - 《阿娜尔罕》
 2014 - 《逆光之恋》
 2015 - 《克拉恋人》

06

JSON 内嵌具有动态 Key 的 JSON

示例代码:

package main

import ( 'encoding/json' 'fmt')

// Opus 作品type Opus struct { Type string Title string}// Actress 女演员type Actress struct { Name string Birthday string BirthPlace string Opus map[string]Opus}

func main () { jsonData := []byte(`{  'name':'迪丽热巴',  'birthday':'1992-06-03',  'birthPlace':'新疆乌鲁木齐市',  'opus':{   '2013':{    'Type':'近代革命剧',    'Title':'《阿娜尔罕》'   },   '2014':{    'Type':'奇幻剧',    'Title':'《逆光之恋》'   },   '2015':{    'Type':'爱情剧',    'Title':'《克拉恋人》'   }  } }`) var actress Actress err := json.Unmarshal(jsonData, &actress) if err != nil {  fmt.Println('error:', err)  return } fmt.Printf('姓名:%s\n', actress.Name) fmt.Printf('生日:%s\n', actress.Birthday) fmt.Printf('出生地:%s\n', actress.BirthPlace) fmt.Println('作品:') for index, value := range actress.Opus {  fmt.Printf('\t日期:%s\n', index)  fmt.Printf('\t\t分类:%s\n', value.Type)  fmt.Printf('\t\t标题:%s\n', value.Title) }}

output:

姓名:迪丽热巴
生日:1992-06-03
出生地:新疆乌鲁木齐市
作品:
 日期:2013
  分类:近代革命剧
  标题:《阿娜尔罕》
 日期:2014
  分类:奇幻剧
  标题:《逆光之恋》
 日期:2015
  分类:爱情剧
  标题:《克拉恋人》

07 总结

我们先是介绍了Golang标准库的encoding/json包中的Unmarshal函数,然后通过上面4个示例代码,分别介绍了如何解码以下4种JSON格式数据:

JSON格式1:

{ 'name':'迪丽热巴', 'birthday':'1992-06-03', 'birthPlace':'新疆乌鲁木齐市', 'opus':[  '《阿娜尔罕》',  '《逆光之恋》',  '《克拉恋人》' ]}

JSON格式2:

{
 'name':'迪丽热巴',
 'birthday':'1992-06-03',
 'birthPlace':'新疆乌鲁木齐市',
 'opus': {
  'Date':'2013',
  'Title':'《阿娜尔罕》'
 }
}

JSON格式3:

{ 'name':'迪丽热巴', 'birthday':'1992-06-03', 'birthPlace':'新疆乌鲁木齐市', 'opus':[  {   'date':'2013',   'title':'《阿娜尔罕》'  },  {   'date':'2014',   'title':'《逆光之恋》'  },  {   'date':'2015',   'title':'《克拉恋人》'  } ]}

JSON格式4:

{
 'name':'迪丽热巴',
 'birthday':'1992-06-03',
 'birthPlace':'新疆乌鲁木齐市',
 'opus':{
  '2013':{
   'Type':'近代革命剧',
   'Title':'《阿娜尔罕》'
  },
  '2014':{
   'Type':'奇幻剧',
   'Title':'《逆光之恋》'
  },
  '2015':{
   'Type':'爱情剧',
   'Title':'《克拉恋人》'
  }
 }
}
喜欢明哥文章的同学
(0)

相关推荐

  • 诚之和:如何使用Go语言JSON 标准库

    本篇内容主要讲解"如何使用Go语言JSON 标准库",感兴趣的朋友不妨来看看.本文介绍的方法操作简单快捷,实用性强.下面就让小编来带大家学习"如何使用Go语言JSON 标 ...

  • beego 获取字符串中的数据

    获取数据并转为对应的类型 - ?id=111&id=122 c.GetInt('id') int,111 - ?id=111&id=122 c.GetBool('id') bool,f ...

  • 高中物理电场中运动的四种常见思想解析

    带电体在电场中的运动是"电场"一章中的重要问题之一.为了理顺关系,有的放矢地选择规律,清除学习上的障碍和思维盲点,对这类问题应掌握并灵活运用四种常见的解决问题的思想,即:力和运动. ...

  • 规范详解:消防规范中楼梯的几种常见理解误区(视频+语音版)

    视频音频长度20分钟,介绍了常见的对于2014版<建筑设计防火规范>中疏散楼梯的常见理解误区. 比如: 误以为敞开楼梯和敞开楼梯间是一回事, 误以为封闭楼梯间如果不能自然通风话,必须设置成 ...

  • 小学数学教材中蕴涵的7种常见数学思想方法

    小学数学教材中蕴涵了几种常见的数学思想方法,梳理一下,大概有以下七种: 1.归纳. 归纳是通过特例的分析引出普遍的结论.在研究一般性问题时,先研究几个简单.个别的.特殊的情况,从中概括出一般的规律和性 ...

  • 四种常见热源费用数据对比,商用热水还是空气源热泵最节能

    在商用热水领域中,空气源热泵已经成为越来越多用户的选择,特别是酒店.医院.学校等场所,空气源热泵的市场占有率居高不下.之所以市场越来越青睐空气源热泵热水,最重要的一点的就是节能效果明显. 那么空气源热 ...

  • 8种常见的大数据分析模型

    重磅干货,第一时间送达 这篇文章给大家简单介绍一下八个模型,具体如下: 1.留存分析模型 留存分析模型是一种用来分析用户参与情况/活跃程度的分析模型,考察进行初始行为的用户中,有多少人会进行后续行为. ...

  • 一病一中药,12种常见病症的“必选”中成...

    12种常见病症的"必选"中成药,建议收藏保存! 1.腰膝酸软--必选--金贵肾气丸. 用于:肾虚水肿,腰膝酸软,小便不利,畏寒肢冷. 2.高血压--山楂降压胶囊. 用于:高血压病. ...

  • 几种常见石头在景观布局中的造景设计

    景观石 · 种类 Type 太湖石 岩类:石灰岩 主要产地:苏南.浙西.皖南.桂北.滇东.鲁南 特点:蚀面凹凸以致穿孔剔透 主要应用类型:特置.群置.叠山 又名窟窿石.是高档的假山石观赏石的一种, 材 ...

  • 这两种常见谷物,是《本草纲目》中的经典消食药

    原创 冯建春 等 悦读中医 2月16日 小编导读 这个春节假期你都吃到哪些美食了呢?美味虽好,有时一旦控制不住却可能吃得太多,引起积食,出现腹胀.食欲不振等表现.今天小编将与大家分享两味<本草纲 ...

  • 10种常见的诗词语言风格,你喜欢哪一种?

    醉月诗苑 (1)平实质朴.其特点是选用确切的字眼直接陈述,或用白描,不加修饰,显得真切深刻,平易近人.如贾岛的<访隐者不遇>:"松下问童子,言师采药去.只在此山中,云深不知处.& ...