Golang JSON、MD5、XML
JSON编码 使用encoding/json包
func Marshal(v interface{}) ([]byte, error)
package main
import (
"encoding/json"
"fmt"
)
func main() {
//对数值型编码
i := 5
data, err := json.Marshal(i)
//判断编码是否成功
if err != nil {
panic(err)
}
fmt.Println(string(data)) //5
//bool值编码
flag := true
data, err = json.Marshal(flag)
fmt.Println(string(data)) //true //注意不会编码为1
//字符串
str := "demo test"
data, err = json.Marshal(str)
fmt.Println(string(data)) //"demo test"
//对数组编码
arr := [5]int{1, 2, 3, 4, 5}
data, err = json.Marshal(arr)
fmt.Println(string(data)) //[1,2,3,4,5]
//对map映射编码
m := map[string]string{
"one": "hello",
"two": "world",
}
data, err = json.Marshal(m)
fmt.Println(string(data)) //{"one":"hello","two":"world"}
}
对结构体进行json编码
对结构体进行编码的时候,要注意,只会对可见的属性字段进行编码,不会对不可见的属性进行编码。
也就是说,只有当结构体中的属性首字母是大写的,才会对这个属性进行编码,否则会忽略掉首字母小写的属性。
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string
Age int
gender string
}
func main() {
p := Person{"Jane", 33, "female"}
data, _ := json.Marshal(p)
fmt.Println(string(data)) //{"Name":"Jane","Age":33}
//注意,首字母小写的gender属性并没有被编码
}
结构体中使用标签
在对结构体进行json编码的时候,还可以指定属性编码时,属性的名称,即可以替换原始的属性名。
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"person_name"`
Age int
gender string
}
func main() {
p := Person{"Jane", 33, "female"}
data, _ := json.Marshal(p)
fmt.Println(string(data)) //{"person_name":"Jane","Age":33}
//注意,首字母小写的gender属性并没有被编码
//p中的Name已经被改成了person_name,在结构体`json:"field"`指定
//如果未指定`json:"field"`,则会沿用原属性名
}
JSON解码
func Unmarshal(data []byte, v interface{}) error
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"person_name"`
Age int
gender string
}
func EncodeAndDecode(source interface{}) {
data, err := json.Marshal(source)
if err != nil {
panic(err)
}
fmt.Println("编码后:", string(data))
var dest interface{}
json.Unmarshal(data, &dest)
fmt.Println("解码后:", dest)
}
func main() {
arr := [5]int{1, 2, 3, 4, 5}
EncodeAndDecode(arr)
//编码后: [1,2,3,4,5]
//解码后: [1 2 3 4 5]
flag := true
EncodeAndDecode(flag)
//编码后: true
//解码后: true
p := Person{"jane", 40, "female"}
EncodeAndDecode(p)
//编码后: {"person_name":"jane","Age":40}
//解码后: map[person_name:jane Age:40]
}
注意结构体编码后在解码,结果是一个map。
XML编码和解码 使用encoding/xml包
xml编码的声明:func Marshal(v interface{}) ([]byte, error)
xml解码的声明:
package main
import (
"encoding/xml"
"fmt"
)
func main() {
var data []byte
var err error
//字符串型转换为XML
s := "hello world"
//func Marshal(v interface{}) ([]byte, error)
data, err = xml.Marshal(s)
fmt.Println(string(data), err) //<string>hello world</string> <nil>
//XML转为字符串型
//func Unmarshal(data []byte, v interface{}) error
var ss string
xml.Unmarshal(data, &ss) //注意传递的是指针(地址)
fmt.Println(ss) //hello world
//或者
sss := new(string)
xml.Unmarshal(data, sss)
fmt.Println(*sss) //hello world
//整型转换为XML
i := 15
data, err = xml.Marshal(i)
fmt.Println(string(data), err) //<int>15</int> <nil>
//XML转为整型
var ii int
xml.Unmarshal(data, &ii)
fmt.Println(ii) //15
//或者
iii := new(int)
xml.Unmarshal(data, iii)
fmt.Println(*iii) //15
}
结构体与XML的格式转换
将结构体编码为xml:注意在编码时,只对结构体中可见的属性进行编码,不会对不可见的属性(首字母小写)编码之后。
package main
import (
"encoding/xml"
"fmt"
)
type Person struct {
Name string
age int
Addr string
}
func main() {
var data []byte
var err error
p := Person{"张飞", 1000, "北京"}
//普通编码
//func Marshal(v interface{}) ([]byte, error)
data, err = xml.Marshal(p)
fmt.Println(string(data), err)
//<Person><Name>张飞</Name><Addr>北京</Addr></Person> <nil>
//有缩进的编码
//func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error)
data, err = xml.MarshalIndent(p, "", " ")
fmt.Println(string(data), err)
/*
<Person>
<Name>张飞</Name>
<Addr>北京</Addr>
</Person> <nil>
*/
//有前缀的编码
data, err = xml.MarshalIndent(p, "#", " ")
fmt.Println(string(data), err)
/*
#<Person>
# <Name>张飞</Name>
# <Addr>北京</Addr>
#</Person> <nil>
*/
}
MD5加密
package main
import (
"crypto/md5"
"fmt"
)
func main() {
Md5Instance := md5.New()
//Md5Instance.Write([]byte("hello"))
res := Md5Instance.Sum([]byte(""))
fmt.Println(string(res)) //]A@*�K*v�q��Œ
fmt.Printf("%x", res) //5d41402abc4b2a76b9719d911017c592
}
md5加密之后,可以使用%x以16进制格式打印结果。
如需转载,请注明文章出处,谢谢!!!
浙公网安备 33010602011771号