操作JSON数据

Posted rebootok

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作JSON数据相关的知识,希望对你有一定的参考价值。

JSON格式

  • javascript对象表示法(JSON)是一种用于发送和接收结构化信息的标准协议。
  • JSON是对JavaScript中各种类型的值——字符串、数字、布尔值和对象——Unicode文本编码。
  • Go语言对于这些标准格式的编码和解码都有良好的支持,由标准库中的encoding/json、encoding/xml、encoding/asn1等包提供支持。

编码

  • 待编码的结构体可以在声明中添加元信息来辅助json操作。
  • 结构体字段的元信息在字段声明的尾部使用字面值表示即被反单引号包围。
  • 元信息格式为json:"内容",其中内容可以指定解析后的字段名,添加omitempty可以使编码时跳过零值字段。
  • 需要编码的字符首字母必须大写,即为可导出的字段。

解码

  • 解码需要有json内容对应的结构体来接收。
  • 未出现在结构体中的数据将不解析。
  • 结构体字段首字母小写的也不会被解析。

实例

  • 除了json.MarShaljson.UnMarShal也提供了json.Encodejson.Decode数据流方式的操作。
package main

import (
	"encoding/json"
	"fmt"
	"net/http"
)

type Info struct {
	Name   string
	Sex    byte `json:"性别,omitempty"`
	Age    int
	adress string // 小写名称不会被解析
}

func main() {

	infos := []Info{
		{Name: "张三", Sex: 0, Age: 21, adress: "湖北"},
		{Name: "李四", Sex: 1, Age: 20, adress: "湖北"},
		{Name: "王五", Sex: 1, Age: 19, adress: "湖北"},
		{Name: "赵六", Sex: 0, Age: 18, adress: "湖北"},
	}

	// 编码
	jsonStr, err := json.MarshalIndent(infos, "", "  ") // json.Marshal 无空格输出
	if err != nil {
		fmt.Println(err.Error())
	}
	fmt.Println("编码结果:
", string(jsonStr))

	// 解码
	var data []struct{ Name string }
	err = json.Unmarshal(jsonStr, &data)
	if err != nil {
		fmt.Println(err.Error())
	}
	fmt.Printf("解码结果: 
 %#v 
", data)

	TestNewDecode()
}

func TestNewDecode() {

	// json.NewDecode 针对数据流操作
	var commitInfo struct{ Node_id, Url, html_url string }
	resp, err := http.Get("https://api.github.com/repos/golang/go/git/commits/db66972359073ce2f83c9863d77444eca5a73006")
	if err != nil {
		fmt.Println(err.Error())
	}
	defer resp.Body.Close()
	err = json.NewDecoder(resp.Body).Decode(&commitInfo)
	if err != nil {
		fmt.Println(err.Error())
	}
	fmt.Printf("Decode结果:
 %#v 
", commitInfo)
}

以上是关于操作JSON数据的主要内容,如果未能解决你的问题,请参考以下文章

VSCode 如何操作用户自定义代码片段(快捷键)

如何从片段中的 JSON 响应中的对象获取数据

json 个人的vscode的代码片段

我无法在片段中加载数据 json

使用 AsyncTask 从 JSON 中获取数据

json 可视代码工作室Angular with Firebase片段