解析复杂jason
//{"Name":"Xiao Ming","Age":16,"Guake":true,"Classes":["Math","English","Chinese"],"Price":9.99}
package main
import (
"fmt"
"encoding/json"
)
type Student struct {
Name string
Age int
Guake bool
Classes []string
Price float32
}
func (s * Student)ShowStu() {
fmt.Println("show Student :")
fmt.Println("\tName\t:", s.Name)
fmt.Println("\tAge\t:", s.Age)
fmt.Println("\tGuake\t:", s.Guake)
fmt.Println("\tPrice\t:", s.Price)
fmt.Printf("\tClasses\t: ")
for _, a := range s.Classes {
fmt.Printf("%s ", a)
}
fmt.Println("")
}
func main() {
st := &Student {
"Xiao Ming",
16,
true,
[]string{"Math", "English", "Chinese"},
9.99,
}
fmt.Println("before JSON encoding :")
st.ShowStu()
b, err := json.Marshal(st)
if err != nil {
fmt.Println("encoding faild")
} else {
fmt.Println("encoded data : ")
fmt.Println(b)
fmt.Println(string(b))
}
ch := make(chan string, 1)
go func(c chan string, str string){
c <- str
}(ch, string(b))
strData := <-ch
fmt.Println("--------------------------------")
stb := &Student{}
stb.ShowStu()
err = json.Unmarshal([]byte(strData), &stb)
if err != nil {
fmt.Println("Unmarshal faild")
} else {
fmt.Println("Unmarshal success")
stb.ShowStu()
}
}
客户端与服务端的交互
type bodydata struct {
Url string
UploadFile string
StartTime string
EndTime string
TimeLen string
FileName string
Response_address string
}
curl -d "{\"url\":\"http://10.80.3.17/otv/test/live/channel03/index.m3u8\",\"UploadFile\":\"s.jpg\",\"StartTime\":\"2017-11-06 19:00:00\",\"EndTime\":\"2017-11-06 19:01:00\",\"TimeLen\":\"20\",\"FileName\":\"test.mp4\",\"Response_address\":\"xxx\"}" "http://10.80.3.17:8001/xxx"
或
curl -d '{"url":"http://10.80.3.17/otv/test/live/channel03/index.m3u8","UploadFile":"s.jpg\",\"StartTime":"2017-11-06 19:00:00","EndTime":"2017-11-06 19:01:00","TimeLen":"20","FileName":"test.mp4","Response_address":"xxx"}'
"http://10.80.3.17:8001/xxx"
json形式打印结构体
两种常用打印 //如果值是一个结构体,%+v 的格式化输出内容将包括结构体的字段名。 fmt.Printf("%+v\n", p) // {x:1 y:2} //%#v 形式则输出这个值的 Go 语法表示。例如,值的运行源代码片段。 fmt.Printf("%#v\n", p) // main.point{x:1, y:2}Config为定义的结构体
import
(
"encoding/json"
}
b, err := json.Marshal(*conf)
if err != nil {
return fmt.Sprintf("%+v", *conf)
}
var out bytes.Buffer
err = json.Indent(&out, b, "", " ")
if err != nil {
return fmt.Sprintf("%+v", *conf)
}
return out.String()
}
解析xml
type xmldata struct {
//XMLName xml.Name `xml:"servers"`
Cmd string `xml:"cmd"`
Uuid string `xml:"uuid"`
filename string
}
xml包会解析字段中的tag,如果tag为:`xml:”,attr”`,表示该字段是该元素的属性。注意,解析xml,要求tag必须以xml:开头,后面的必须在双引号中。这是根据反射包中StructTag类型的func (tag StructTag) Get(key string) string方法解析的,代码中固定写死了:Get(“xml”),这样来获得”,attr”这一部分。
那么”,attr”前面的逗号是啥意思?我们知道,一般xml中元素和属性等都会用小写,而我们上面的例子中,用的都是大写,如果改为小写,解析不成功(个人感觉,xml库应该支持xml元素小写时,将其首字母变为大写,当然,可能设计者更希望的是通过tag来实现xml解析)