zoukankan      html  css  js  c++  java
  • golang ---JSON

    由标准库中的encoding/json包提供支持

    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: "Casablanca", Year: 1942, Color: false,
    		Actors: []string{"Humphrey Bogart", "Ingrid Bergman"}},
    	{Title: "Cool Hand Luke", Year: 1967, Color: true,
    		Actors: []string{"Paul Newman"}},
    	{Title: "Bullitt", Year: 1968, Color: true,
    		Actors: []string{"Steve McQueen", "Jacqueline Bisset"}},
    }
    
    func main() {
    	data, err := json.Marshal(movies)
    	if err != nil {
    		log.Fatalf("JSON marshaling failed: %s", err)
    	}
    	fmt.Printf("%s
    ", data)
    
    }
    

    将一个Go语言中类似movies的结构体slice转为JSON的过程叫编组(marshaling)。编组通过调用json.Marshal函数完成,

    Marshal函数返还一个编码后的字节slice,包含很长的字符串,并且没有空白缩进;我们将它
    折行以便于显示:

    [{"Title":"Casablanca","released":1942,"Actors":["Humphrey Bogart","Ingr
    id Bergman"]},{"Title":"Cool Hand Luke","released":1967,"color":true,"Ac
    tors":["Paul Newman"]},{"Title":"Bullitt","released":1968,"color":true,"
    Actors":["Steve McQueen","Jacqueline Bisset"]}]
    

      

    这种紧凑的表示形式虽然包含了全部的信息,但是很难阅读。为了生成便于阅读的格式,另
    一个json.MarshalIndent函数将产生整齐缩进的输出。该函数有两个额外的字符串参数用于表
    示每一行输出的前缀和每一个层级的缩进:

    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: "Casablanca", Year: 1942, Color: false,
    		Actors: []string{"Humphrey Bogart", "Ingrid Bergman"}},
    	{Title: "Cool Hand Luke", Year: 1967, Color: true,
    		Actors: []string{"Paul Newman"}},
    	{Title: "Bullitt", Year: 1968, Color: true,
    		Actors: []string{"Steve McQueen", "Jacqueline Bisset"}},
    }
    
    func main() {
    	//data, err := json.Marshal(movies)
    	data, err := json.MarshalIndent(movies, "", " ")
    	if err != nil {
    		log.Fatalf("JSON marshaling failed: %s", err)
    	}
    	fmt.Printf("%s
    ", data)
    
    }
    

     结果输出:

    [
     {
      "Title": "Casablanca",
      "released": 1942,
      "Actors": [
       "Humphrey Bogart",
       "Ingrid Bergman"
      ]
     },
     {
      "Title": "Cool Hand Luke",
      "released": 1967,
      "color": true,
      "Actors": [
       "Paul Newman"
      ]
     },
     {
      "Title": "Bullitt",
      "released": 1968,
      "color": true,
      "Actors": [
       "Steve McQueen",
       "Jacqueline Bisset"
      ]
     }
    ]
    

      在编码时,默认使用Go语言结构体的成员名字作为JSON的对象,

    只有导出的结构体成员才会被编码,这也就是我们为什么选择用大写字
    母开头的成员名称

    Year名字的成员在编码后变成了released,还有Color成员
    编码后变成了小写字母开头的color。这是因为构体成员Tag所导致的。一个构体成员Tag是和
    在编译阶段关联到该成员的元信息字符串:

    Year int `json:"released"`
    Color bool `json:"color,omitempty"`
    

      

    结构体的成员Tag可以是任意的字符串面值,但是通常是一系列用空格分隔的key:"value"键值
    对序列;因为值中含义双引号字符,因此成员Tag一般用原生字符串面值的形式书写。json开
    头键名对应的值用于控制encoding/json包的编码和解码的行为,并且encoding/...下面其它的
    包也遵循这个约定。成员Tag中json对应值的第一部分用于指定JSON对象的名字,Color成员的Tag还带了一个额外
    的omitempty选项,表示当Go语言结构体成员为空或零值时不生成JSON对象(这里false为零
    值)。果然,Casablanca是一个黑白电影,并没有输出Color成员。

    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: "Casablanca", Year: 1942, Color: false,
    		Actors: []string{"Humphrey Bogart", "Ingrid Bergman"}},
    	{Title: "Cool Hand Luke", Year: 1967, Color: true,
    		Actors: []string{"Paul Newman"}},
    	{Title: "Bullitt", Year: 1968, Color: true,
    		Actors: []string{"Steve McQueen", "Jacqueline Bisset"}},
    }
    
    
    func main() {
    	//data, err := json.Marshal(movies)
    	data, err := json.MarshalIndent(movies, "", " ")
    	if err != nil {
    		log.Fatalf("JSON marshaling failed: %s", err)
    	}
    	fmt.Printf("%s
    ", data)
    
    
    	var titles []struct{ Title string }
    	if err := json.Unmarshal(data, &titles); err != nil {
    		log.Fatalf("JSON unmarshaling failed: %s", err)
    	}
    	fmt.Println(titles) // "[{Casablanca} {Cool Hand Luke} {Bullitt}]"
    
    
    }

    编码的逆操作是解码,对应将JSON数据解码为Go语言的数据结构,Go语言中一般叫
    unmarshaling,通过json.Unmarshal函数完成。下面的代码将JSON格式的电影数据解码为一
    个结构体slice,结构体中只有Title成员。通过定义合适的Go语言数据结构,我们可以选择性
    地解码JSON中感兴趣的成员。当Unmarshal函数调用返回,slice将被只含有Title信息值填
    充,其它JSON成员将被忽略。

  • 相关阅读:
    使用正则匹配数字
    钻石和玻璃球游戏(钻石位置不固定)
    简单绘图
    未解决问题02
    Sqlite3 实现学生信息增删改查
    【Python】科赫雪花绘制
    【Python爬虫】抖音去水印
    【MATLAB】数学计算软件 MathWorks MATLAB R2020a 中文破解版
    【C语言】用指针作为形参完成数据的升序排列
    【C语言】数组名作函数参数完成数据的升序排列
  • 原文地址:https://www.cnblogs.com/saryli/p/10028310.html
Copyright © 2011-2022 走看看