go解析json/xml

解析复杂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"

}
func (conf *Config) String() string {
    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解析)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值