# Go 解析json

> xml, yaml解析的用法类似
>
> xml 使用库`encodeing/xml`
>
> yaml 使用库 `gopkg.in/yaml.v2`

JSON：JavaScript 对象表示法（JavaScript Object Notation）。\
JSON 是存储和交换文本信息的语法。类似 XML。\
JSON 比 XML 更小、更快，更易解析

## 序列化

```go
package main

import (
    "encoding/json"
    "fmt"
)

type Person struct {
    Name string
    Age  int
    Sex  string
}

func main() {
    p := &Person{
        Name: "John",
        Age:  24,
        Sex:  "man",
    }
    // data, _ := json.MarshalIndent(p, "", "    ") 格式化
    data, _ := json.Marshal(p)
    fmt.Println(string(data))
}
```

```go
package main

import (
    "encoding/json"
    "fmt"
)

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"-"`
    Sex  string `json:"sex,omitempty"`
}

// 解析的时候忽略该字段。默认情况下会解析这个字段，因为它是大写字母开头的
// Field int   `json:"-"`

// 解析（encode/decode） 的时候，使用 `other_name`，而不是 `Field`
// Field int   `json:"other_name"`

// 解析的时候使用 `other_name`，如果struct 中这个值为空，就忽略它
// Field int   `json:"other_name,omitempty"

func main() {
    persons := []Person{
        Person{
            Name: "John",
            Age: 24,
            Sex: "man",
        },
        Person{
            Name: "Anna",
            Age: 22,
        },
    }
    data, _ := json.Marshal(persons)
    fmt.Println(string(data))
}
```

## 反序列化

```go
package main

import (
    "encoding/json"
    "fmt"
)

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
    Sex  string `json:"sex,omitempty"`
}

func main() {
    pJson := `{"name":"John","Age":24,"Sex":"man"}`
    p := &Person{}
    err := json.Unmarshal([]byte(pJson), p)
    if err != nil {
        fmt.Println(err.Error())
    }
    fmt.Println(p.Name)
}
```

```go
func main() {
    pJson := `[{"name":"John","sex":"man"},{"name":"Anna","age":24}]`
    p := []Person{}
    err := json.Unmarshal([]byte(pJson), &p)
    if err != nil {
        log.Fatal(err.Error())
    }
    fmt.Println(p)
}
```
