生成request body | 青训营

51 阅读2分钟

生成request body

package main

import (
	"encoding/json"
	"fmt"
)

type userInfo struct {
	Name  string
	Age   int
	Hobby []string
}

func test1() {
	a := userInfo{
		Name:  "wang",
		Age:   18,
		Hobby: []string{"Golang"},
	}

	buf, err := json.Marshal(a)
	if err != nil {
		panic(err)
	}
	fmt.Println(buf)
	fmt.Printf(string(buf))
	
	buf, err = json.MarshalIndent(a, "", "\t")
	if err != nil {
		panic(err)
	}
	fmt.Println(string(buf))

	var b userInfo
	err = json.Unmarshal(buf, &b)
	if err != nil {
		panic(err)
	}
	fmt.Printf("%#v\n", b)
}

json.Marshal()

a := userInfo{
		Name:  "wang",
		Age:   18,
		Hobby: []string{"Golang"},
	}

	buf, err := json.Marshal(a)
	if err != nil {
		panic(err)
	}
	fmt.Println(buf)
	fmt.Printf(string(buf))

json.MarshalIndent()

json.MarshalIndent() 函数是 Go 语言标准库 encoding/json 中提供的一个函数,用于将 Go 语言中的数据结构转换为 JSON 格式的字符串,并且可以通过缩进和分隔符来格式化输出。

json.MarshalIndent() 函数的定义如下:

func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error)

第一个参数 v 是要序列化为 JSON 格式的对象;

第二个参数 prefix 是每行输出前缀,通常用于缩进;

第三个参数 indent 是用于缩进的字符串。

json.MarshalIndent() 函数返回序列化后的 JSON 字符串和可能出现的错误。

例如,假设我们有以下的结构体类型:

type Person struct {
    Name    string
    Age     int
    Address string
}

我们可以创建一个该类型的实例并将其转换为 JSON 格式的字符串,代码如下:

p := Person{Name: "Alice", Age: 30, Address: "123 Main St"}
b, err := json.MarshalIndent(p, "", "  ")
if err != nil {
    log.Fatal(err)
}
fmt.Println(string(b))

这段代码将会输出下面的 JSON 字符串:

{
  "Name": "Alice",
  "Age": 30,
  "Address": "123 Main St"
}

可以看到,JSON 字符串被使用了两个空格作为缩进符,并且每个字段都单独占据一行,使得输出更加易读。

string

	buf, err := json.Marshal(a)
	if err != nil {
		panic(err)
	}
	fmt.Println(buf)
	fmt.Printf(string(buf))

在这段代码中,json.Marshal(a)返回一个字节数组(byte array),表示JSON编码的结果。

这时候就需要使用string()函数来完成从字节数组到字符串的转换。

string()函数将字节数组解释为UTF-8编码的字符串,并返回该字符串。因此,fmt.Printf(string(buf))语句会打印出buf字节数组所表示的UTF-8编码字符串。

fmt.Printf()

fmt.Printf("%#v\n", b)
fmt.Printf("%v\n", b)

这两个代码的区别在于它们打印结构体时使用的格式化字符串不同。

第一个代码 fmt.Printf("%#v\n", b) 使用 %#v 格式化字符串,它会以 Go 语言的语法格式输出变量 b 的值。例如,如果 b 是一个结构体,那么该代码将输出类似于 main.MyStruct{Field1: "value1", Field2: "value2"} 这样的格式。

第二个代码 fmt.Printf("%v\n", b) 使用 %v 格式化字符串,它会根据变量 b 的实际类型选择合适的默认格式输出值。对于结构体来说,默认格式是按照 {字段1 值1 字段2 值2 ...} 的格式输出。

因此,使用 %#v 可以更全面地输出结构体的值,包括字段名和类型信息,而 %v 会根据变量的实际类型选择默认的格式进行输出。