Кодирование и парсинг Golang Json

оглавление

1. Кодирование: func Marshal 

2. Анализ: func Unmarshal


В пакете Golang encoding / json предусмотрены две функции Marshal и Unmarshal, которые используются для кодирования и декодирования (анализа) данных в формате Json соответственно.

1. Кодирование: func Marshal 

func Marshal (v interface {}) ([] байт, ошибка)

Функция: возвращает данные Json, закодированные с помощью v, обратите внимание, что это [] байт, например:

package main

import (
	"encoding/json"
	"fmt"
)

type Students struct {
	Name   string `Json:"name"`
	Height int    `Json:"height"`
	Sex    string `Json:"sex"`
}

type Teachers struct {
	Name   string `Json:"name"`
	Height int    `Json:"height"`
	Sex    string `Json:"sex"`
}

type School struct {
	Name    string     `Json:"name"`
	Area    int        `Json:"area"`
	Student []Students `Json:"student"`
	Teacher []Teachers `Json:"teacher"`
}

//initAssignment 初始化School
func initAssignment() School {
	student := []Students{
		{"张三", 180, "男"},
		{"王丽", 165, "女"},
	}
	teacher := []Teachers{
		{"李四", 180, "女"},
		{"王五", 177, "男"},
	}
	school := School{"中关村大学", 1024, student, teacher}

	return school
}

func main() {
	school := initAssignment()
	schoolJson, err := json.Marshal(school)
	if err != nil {
		fmt.Println("Umarshal Error:" + err.Error())
		return
	}
	fmt.Println("schoolJson:", string(schoolJson))
}

В приведенном выше примере есть три структуры School, Students и Teacher. Среди них School, содержащая две последних, создает экземпляр типа School и преобразует его в тип Json.

Вывод:

[root@localhost gotest]# go run main.go 
schoolJson: {"Name":"中关村大学","Area":1024,"Student":[{"Name":"张三","Height":180,"Sex":"男"},{"Name":"王丽","Height":165,"Sex":"女"}],"Teacher":[{"Name":"李四","Height":180,"Sex":"女"},{"Name":"王五","Height":177,"Sex":"男"}]}
[root@localhost gotest]#

Это не очень интуитивно понятно, посмотрите на следующую форму:

{
    "Name": "中关村大学",
    "Area": 1024,
    "Student": [
        {
            "Name": "张三",
            "Height": 180,
            "Sex": "男"
        },
        {
            "Name": "王丽",
            "Height": 165,
            "Sex": "女"
        }
    ],
    "Teacher": [
        {
            "Name": "李四",
            "Height": 180,
            "Sex": "女"
        },
        {
            "Name": "王五",
            "Height": 177,
            "Sex": "男"
        }
    ]
}

2. Анализ: func Unmarshal

func Unmarshal (data [] byte, v interface {}) ошибка

Функция: Unmarshal анализирует данные JSON и сохраняет результат в v. Если v равно нулю или не является указателем, Unmarshal возвращает InvalidUnmarshalError, например:

package main

import (
	"encoding/json"
	"fmt"
)

type Students struct {
	Name   string `Json:"name"`
	Height int    `Json:"height"`
	Sex    string `Json:"sex"`
}

type Teachers struct {
	Name   string `Json:"name"`
	Height int    `Json:"height"`
	Sex    string `Json:"sex"`
}

type School struct {
	Name    string     `Json:"name"`
	Area    int        `Json:"area"`
	Student []Students `Json:"student"`
	Teacher []Teachers `Json:"teacher"`
}

func main() {
	var school School
	strJson := `{"name":"中关村大学","area":1024,"student":[{"name":"张三","height":180,"sex":"男"},{"name":"王丽","height":165,"sex":"女"}],"teacher":[{"name":"李四","height":180,"sex":"女"},{"name":"王五","height":177,"sex":"男"}]}`
	err := json.Unmarshal([]byte(strJson), &school) //注意:第二个参数需要传递地址
	if err != nil {
		fmt.Println("Umarshal Error:" + err.Error())
		return
	}
	fmt.Printf("%#v\n", school)
	fmt.Println(school.Name, school.Area)
}

Вывод:

[root@localhost gotest]# go run main.go 
main.School{Name:"中关村大学", Area:1024, Student:[]main.Students{main.Students{Name:"张三", Height:180, Sex:"男"}, main.Students{Name:"王丽", Height:165, Sex:"女"}}, Teacher:[]main.Teachers{main.Teachers{Name:"李四", Height:180, Sex:"女"}, main.Teachers{Name:"王五", Height:177, Sex:"男"}}}
中关村大学 1024
[root@localhost gotest]#

Здесь следует отметить, что первая буква имени переменной в структуре должна быть написана с заглавной буквы, чтобы другие пакеты могли получить доступ к переменной структуры. Вы можете проанализировать соответствующую переменную в Json, добавив `Json:" имя переменной "после переменной.

Ссылка для справки:

[1]  https://golang.org/pkg/encoding/json/

рекомендация

отblog.csdn.net/u011074149/article/details/110291423
рекомендация