Copy package main
import (
"bytes"
"encoding/json"
"fmt"
)
//field要大寫開頭,tag各有其功用
type UserDetail struct {
Name string `json:"name"`
NickName string `json:"nick_name,omitempty"` // Field appears in JSON as key "myName" and the field is omitted from the object if its value is empty,
Address string `json:",omitempty"` //Field appears in JSON as key "Field" (大寫), but the field is skipped if empty.
A string `json:"-"` // Field is ignored by this package.
B string `json:"-,"` // Field appears in JSON as key "-".
AgeString int64 `json:"AgeString,string"` //將輸出轉為string
Age int64 `json:"Age"`
}
type User struct {
Name string `json:"name"`
}
func main() {
user1 := UserDetail{Name: "123", NickName: "123", Address: "123", A: "A", B: "B", AgeString: 123, Age: 12}
jsonMarshal(user1) //-> json str: {"name":"123","my_name":"123","MyName2":"123","-":"B","int64string":"123","int64":123}
value := make(chan int) //unsupportedTypeEncoder #ref1
jsonMarshal(value) //->Marshal err: json: unsupported type: chan int json str:
user2 := User{Name: "<h1>123</h1>"}
jsonMarshal(user2) //->json str: json str: {"name":"\u003ch1\u003e123\u003c/h1\u003e"}
JsonMarshalEscapeHTMLfalse(user2) ->json str: {"name":"<h1>123</h1>"}
}
//struct to json string
func jsonMarshal(u interface{}) {
ub, err := json.Marshal(u)
if err != nil {
fmt.Println("Marshal err:", err)
}
fmt.Println("json str:", string(ub))
}
func JsonMarshalEscapeHTMLfalse(u interface{}) {
ub, err := JsonEscapeHTMLfalse(u)
if err != nil {
fmt.Println("JsonEscapeHTMLfalse err:", err)
}
fmt.Println("json str:", string(ub))
}
func JsonEscapeHTMLfalse(t interface{}) ([]byte, error) {
buffer := &bytes.Buffer{}
encoder := json.NewEncoder(buffer)
encoder.SetEscapeHTML(false)
err := encoder.Encode(t)
return buffer.Bytes(), err
}
o