golang json 序列化二

package main

import (
	"encoding/json"
	"fmt"
)

/*
bool, for JSON booleans
float64, for JSON numbers
string, for JSON strings
[]interface{}, for JSON arrays
map[string]interface{}, for JSON objects
nil for JSON null

详细的编码解码规则,文档上解释的很详细,这里说几个关键点:
①默认情况下,按照上面提到的映射进行解析;
②如果对象实现了 json.Marshaler/Unmarshaler 接口且不是 nil 指针,则调用对应的方法进行编解码;如果没有实现该接口,但实现了 encoding.TextMarshaler/TextUnmarshaler 接口,则调用该接口的相应方法进行编解码;
③struct 中通过 “json” tag 来控制相关编解码,后面通过示例说明;
④struct 的匿名字段,默认展开;可以通过指定 tag 来使其不展开;
⑤如果存在匿名字段,如果同级别有相同字段名,不会冲突,具体处理规则文档有说明;
⑥在解码时到struct时,会忽略多余或不存在的字段(包括不导出的),而不会报错;

另外注意,传递给 Unmarshal 的第二个参数必须是指针

//`json:"price,string"`  //强制把字段price修改成string类型,而不是浮点

加上`json:”-“`;如果在值为空时忽略,加上
omitempty option,如:`json:”,omitempty”`

在解码时,优先匹配 struct 导出字段的 tag,之后是 Field,最后是 Field 的各种大小写不明感的形式,
如 Name,能匹配 NAME/NAme等等

Marshal()函数和 Unmarshal()函数是 json 对象的编解码
MarshalIndent 函数,该函数的功能和 Marshal一致,只是格式化 json,方便人工阅读。如上面例子使用该函数
Encoder 和 Decoder它们分别通过一个 io.Reader 和 io.Writer 实例化,并从中读取数据或写数据
*/
func main() {
	type Book struct {
		Name  string
		Price float64 //`json:"price,string"`  //强制把字段price修改成string类型,而不是浮点
	}

	var person = struct {
		Name string
		Age  int
		Book
	}{
		Name: "polaris",
		Age:  30,
		Book: Book{
			Price: 3.4,
			Name:  "Go语言",
		},
	}
	data, err := json.MarshalIndent(person, "", "\t")
	if err == nil {
		fmt.Println(string(data))
	}

	buf, _ := json.Marshal(person)

	fmt.Println(string(buf))

	// Output:{"Name":"polaris","Age":30,"Price":3.4}

	// Book 中的 Name 被忽略了

}

你可能感兴趣的:(golang)