java map转json字符串_程序猿学Go: JSON解析

e56530f825e20b4f77139c4dad101716.png

json格式可以算我们日常最常用的序列化格式之一了,Go语言作为一个由Google开发,号称互联网的C语言的语言,自然也对JSON格式支持很好。官方提供的Json解析包已经非常强大,我们接下来讲解Json的序列化与反序列化操作。另外还有一些第三方的Json解析库,也能够高效的操作Json对象,比如simplejson,ffjson等。下面是两个比较重要的函数:

• Json Marshal:将数据编码成json字符串

 func Marshal(v interface{}) ([]byte, error)

Marshal 用于将struct对象序列化到json对象中。v是interface{}类型,任何类型都实现了空接口。

1:tag中的第一个参数是用来指定别名,比如Name 指定别名为 username `json:"username"`

2:如果不想指定别名但是想指定其他参数用逗号来分隔,omitempty 指定到一个field时,如果在赋值时对该属性未赋值或者对该属性赋值为 zero value,那么将Person序列化成json时会忽略该字段

3:- 指定到一个field时,无论有没有值将Person序列化成json时都会忽略该字段

4:string 指定到一个field时,比如Person中的Count为int类型 如果没有任何指定在序列化到json之后也是int 比如这个样子 “Count”:0,但是如果指定了string之后序列化之后也是string类型的,那么就是这个样子"Count":"0"

type Person struct {
 Name        string `json:"username"`
 Age         int
 Gender      bool `json:",omitempty"`
 Profile     string
 OmitContent string `json:"-"`
 Count       int    `json:",string"`
}
func main() {
 var p *Person = &Person{
  Name:        "zhuyuqiang",
  Age:         21,
  Gender:      true,
  Profile:     "I am zhuyuqiang",
  OmitContent: "OmitContent",
 }
 
 if bs, err := json.Marshal(p); err != nil {
  panic(err)
 } else {
  fmt.Println(string(bs))
 }
}
 
var p2 *Person = &Person{
  Name:        "brainwu",
  Age:         21,
  Profile:     "I am Wujunbin",
  OmitContent: "OmitConent",
 }
 if bs, err := json.Marshal(p2); err != nil {
  panic(err)
 } else {
  //result --> {"username":"brainwu","Age":21,"Profile":"I am Wujunbin","Count":"0"}
  fmt.Println(string(bs))
 }
 

• slice序列化为Json

 //slice序列化为Json
 var aStr []string = []string{"Go", "Java", "Python", "Android"}
 if bs, err := json.Marshal(aStr); err != nil {
  panic(err)
 } else {
  //result --> ["Go","Java","Python","Android"]
  fmt.Println(string(bs))
 }
 

• map 序列化为Json

 var m map[string]string = make(map[string]string)
 m["Go"] = "No.1"
 m["Java"] = "No.2"
 m["C"] = "No.3"
 if bs, err := json.Marshal(m); err != nil {
  panic(err)
 } else {
  //result --> {"C":"No.3","Go":"No.1","Java":"No.2"}
  fmt.Println(string(bs))
 }

下面的代码存在什么问题,为什么?

type Student struct {
 name string
 age  int
}
 s := Student{"zhangsan", 30}
 if bs, err := json.Marshal(s); err != nil {
  panic(err)
 } else {
  fmt.Println(string(bs))
 }

可以将其直接进行反序列化

var s4 interface{}
json.Unmarshal([]byte(bs), &s4)
fmt.Printf("%v", s4)
for k, v := range s4.(map[string]interface{}) {
 fmt.Println(k, v)
}

• Json Unmarshal:将json字符串解码到相应的数据结构,Unmarshal的第一个参数是[]byte,第二个参数是接受json解析的数据结构。

下面我们依次讲解Json的操作。

1:将Json序列化进入结构体

type Person struct {
 Name   string
 Age    int
 Gender bool
}
 
func main() {
 
 //1:将Json序列化进入结构体
 var p Person
 var str = "{"Name":"zhuyuqiang","Age":20,"Gender":true}"
 json.Unmarshal([]byte(str), &p)
 fmt.Println(p.Age)
 fmt.Println(p.Name)
}
 

2::将Json序列化到结构体slice

 var ps []Person
 var aJson = "[{"Name":"zhangsan","Age":25,"Gender":true},n{"Name":"lisi","Age":20,"Gender":false}]"
 json.Unmarshal([]byte(aJson), &ps)
 fmt.Println(ps, "len is", len(ps))

3:将Json序列化进Map

 var str = "{"Name":"zhuyuqiang","Age":20,"Gender":true}"
 var obj map[string]interface{}
 json.Unmarshal([]byte(str), &obj)
 fmt.Println(obj["Name"])
 fmt.Println(obj["Gender"])

4:将Json序列化进Slice

 var strs string = `["Go", "Java", "C", "Php"]`
 var aStr []string
 json.Unmarshal([]byte(strs), &aStr)
 //result --> [Go Java C Php]  len is 4
 fmt.Println(aStr, " len is", len(aStr))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值