Golang之json操作

主宰稳场 提交于 2020-03-22 14:38:50

3 月,跳不动了?>>>

  • JavaScript对象表示法(JSON)是一种用于发送和接收结构化信息的标准协议。在 类似的协议中,JSON并不是唯一的一个标准协议。 XML(§7.14)、ASN.1和 Google的Protocol Buffers都是类似的协议,并且有各自的特色,但是由于简洁性、 可读性和流行程度等原因,JSON是应用最广泛的一个。
  • Go语言对于这些标准格式的编码和解码都有良好的支持,由标准库中 的 encoding/json 、 encoding/xml 、 encoding/asn1 等包提供支持并且这类包都有着相似的API接口。本节,我们将对重要的 encoding/json 包的 用法做个概述。
  • JSON是对JavaScript中各种类型的值——字符串、数字、布尔值和对象—— Unicode本文编码。它可以用有效可读的方式表示基础数据类型和数组、slice、结 构体和map等聚合数据类型。
  • 基本的JSON类型有数字(十进制或科学记数法)、布尔值(true或false)、字符 串,其中字符串是以双引号包含的Unicode字符序列,支持和Go语言类似的反斜杠 转义特性,不过JSON使用的是 \Uhhhh 转义数字来表示一个UTF-16编码(译注: UTF-16和UTF-8一样是一种变长的编码,有些Unicode码点较大的字符需要用4个 字节表示;而且UTF-16还有大端和小端的问题),而不是Go语言的rune类型。
  • 这些基础类型可以通过JSON的数组和对象类型进行递归组合。
  • 一个JSON数组是一个有序的值序列,写在一个方括号中并以逗号分隔;一个 JSON数组可以用于编码Go语言的数组和slice。
  • 一个JSON对象是一个字符串到值的映射,写成一系列的name:value对形式,用花 括号包含并以逗号分隔;JSON的对象类型可以用于编码Go语言的map类型(key 类型是字符串)和结构体。
// test13_json project main.go
package main

import (
	"encoding/json"
	"fmt"
	"log"
)

type Movie struct {
	Title  string
	Year   int  `json:"released"`
	Color  bool `json:"color,omitempty"`
	Actors []string
}

var movies = []Movie{
	{
		Title:  "战狼2",
		Year:   2017,
		Color:  true,
		Actors: []string{"吴京", "吴刚"},
	},
	{
		Title:  "老炮儿",
		Year:   2015,
		Color:  true,
		Actors: []string{"冯小刚", "吴亦凡", "许晴"},
	},
	{
		Title:  "Bullitt",
		Year:   1968,
		Color:  false,
		Actors: []string{"Steve McQueen", "Jacqueline Bisset"},
	},
}

func main() {
	/*
		注意json 编解码只能处理结构体成员变量是大写的字段,小写的直接忽略
		如果在编码时想让json字符串的字段小写,那么需要再结构体中加Tag
		如果再解码时,json有小写的字段名,那么在定义结构体接收的 时候,成员名要大写,然后也要加Tag
	*/
	
	//编码,将go结构体转换成json字符串
	//json_str, err :=json.Marshal(movies)
	json_data, err := json.MarshalIndent(movies, "", "	") // 带缩进的输出格式
	if err != nil {
		log.Fatal(err)
		return
	}
	fmt.Printf("%s\n", json_data)
	fmt.Println("-----------------------------")

	var titles []struct {
		Title string
	}

	if err := json.Unmarshal(json_data, &titles); err != nil {
		log.Fatal(err)
		return
	}
	fmt.Printf("%+v\n", titles)

	var years []struct {
		Year int `json:"released"`
	}
	if err := json.Unmarshal(json_data, &years); err != nil {
		log.Fatal(err)
		return
	}
	fmt.Printf("%+v\n", years)

	var actors []struct {
		Actors []string
	}
	if err := json.Unmarshal(json_data, &actors); err != nil {
		log.Fatal(err)
		return
	}
	fmt.Printf("%+v\n", actors)
	fmt.Println("--------------------------")

	var my_movies []struct {
		Title  string
		Year   int `json:"released"`
		Actors []string
	}

	if err := json.Unmarshal(json_data, &my_movies); err != nil {
		log.Fatal(err)
		return
	}
	fmt.Printf("%+v\n", my_movies)
}

输出如下:

[
	{
		"Title": "战狼2",
		"released": 2017,
		"color": true,
		"Actors": [
			"吴京",
			"吴刚"
		]
	},
	{
		"Title": "老炮儿",
		"released": 2015,
		"color": true,
		"Actors": [
			"冯小刚",
			"吴亦凡",
			"许晴"
		]
	},
	{
		"Title": "Bullitt",
		"released": 1968,
		"Actors": [
			"Steve McQueen",
			"Jacqueline Bisset"
		]
	}
]
-----------------------------
[{Title:战狼2} {Title:老炮儿} {Title:Bullitt}]
[{Year:2017} {Year:2015} {Year:1968}]
[{Actors:[吴京 吴刚]} {Actors:[冯小刚 吴亦凡 许晴]} {Actors:[Steve McQueen Jacqueline Bisset]}]
--------------------------
[{Title:战狼2 Year:2017 Actors:[吴京 吴刚]} {Title:老炮儿 Year:2015 Actors:[冯小刚 吴亦凡 许晴]} {Title:Bullitt Year:1968 Actors:[Steve McQueen Jacqueline Bisset]}]
成功: 进程退出代码 0.
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!