Tabla de contenido
En el paquete Golang encoding / json se proporcionan dos funciones Marshal y Unmarshal, que se utilizan para codificar y decodificar (analizar) datos en formato Json respectivamente.
1. Codificación: func Marshal
func Marshal (v interfaz {}) ([] byte, error)
Función: Devuelve los datos Json codificados por v, tenga en cuenta que es [] byte, por ejemplo:
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))
}
En el ejemplo anterior, hay tres estructuras School, Students y Teacher. Entre ellas, School contiene las dos últimas, crea una instancia de un tipo School y lo convierte en un tipo Json.
Salida:
[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]#
Esto no es muy intuitivo, mira el siguiente formulario:
{
"Name": "中关村大学",
"Area": 1024,
"Student": [
{
"Name": "张三",
"Height": 180,
"Sex": "男"
},
{
"Name": "王丽",
"Height": 165,
"Sex": "女"
}
],
"Teacher": [
{
"Name": "李四",
"Height": 180,
"Sex": "女"
},
{
"Name": "王五",
"Height": 177,
"Sex": "男"
}
]
}
2. Análisis: func Unmarshal
func Unmarshal (datos [] byte, v interfaz {}) error
Función: Unmarshal analiza los datos JSON y almacena el resultado en v. Si v es nil o no es un puntero, Unmarshal devuelve InvalidUnmarshalError, por ejemplo:
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)
}
Salida:
[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]#
Cabe señalar aquí que la primera letra del nombre de la variable en la estructura debe estar en mayúscula para que otros paquetes puedan acceder a la variable de la estructura. Puede analizar la variable correspondiente en Json agregando `Json:" nombre de variable "` después de la variable.
Link de referencia: