golang json 编码解码

json 编码

package main

import (
	"encoding/json"
	"fmt"
)

type Person struct {
	Name string `json:"name"`
	Age int `json:"age"`
}

func main()  {
	person := Person{"ruby", 24}

	b, err := json.Marshal(&person)
	if err == nil {
		fmt.Printf("%s\n", b)
	} else {
		// 错误处理
	}
}

  

关键方法 json.Marshal:

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

  这个方法返回的结果是一个字节数组,如果需要转字符串,可以 string(xxx),如:

fmt.Println(string(b))

  

json 解码

package main

import (
	"encoding/json"
	"strings"
	"fmt"
)

type Person struct {
	Name string `json:"name"`
	Age int `json:"age"`
}

func main() {
	// 需要解码的 json 字符串
	str := `
		{"name":"ruby","age":24}
	`

	// json decoder 对象, 有个 Decode 方法, 接受一个 struct 参数
	decoder := json.NewDecoder(strings.NewReader(str))
	var person Person
	err := decoder.Decode(&person)
	if err == nil {
		fmt.Println(person.Name)
		fmt.Println(person.Age)
	}
}

  

写成一行就是(str 是需要解码的字符串,v 是结构体变量,需要解码成什么 struct 就定义什么 struct 变量):

json.NewDecoder(strings.NewReader(str)).Decode(v)

 

总结:

json encode:

1、json.NewEncoder(<Writer>).encode(&v)

2、json.Marshal(&v)

json decode:

1、json.NewDecoder(<Reader>).decode(&v)

2、json.Unmarshal(&v)

 

下面是 all in one,几种方法的使用比较清晰:

package main

import (
	"encoding/json"
	"fmt"
	"bytes"
	"strings"
)

type Person struct {
	Name string `json:"name"`
	Age int `json:"age"`
}

func main()  {
	// 1. 使用 json.Marshal 编码
	person1 := Person{"张三", 24}
	bytes1, err := json.Marshal(&person1)
	if err == nil {
		// 返回的是字节数组 []byte
		fmt.Println("json.Marshal 编码结果: ", string(bytes1))
	}

	// 2. 使用 json.Unmarshal 解码
	str := `{"name":"李四","age":25}`
	// json.Unmarshal 需要字节数组参数, 需要把字符串转为 []byte 类型
	bytes2 := []byte(str) // 字符串转换为字节数组
	var person2 Person    // 用来接收解码后的结果
	if json.Unmarshal(bytes2, &person2) == nil {
		fmt.Println("json.Unmarshal 解码结果: ", person2.Name, person2.Age)
	}

	// 3. 使用 json.NewEncoder 编码
	person3 := Person{"王五", 30}
	// 编码结果暂存到 buffer
	bytes3 := new(bytes.Buffer)
	_ = json.NewEncoder(bytes3).Encode(person3)
	if err == nil {
		fmt.Print("json.NewEncoder 编码结果: ", string(bytes3.Bytes()))
	}

	// 4. 使用 json.NewDecoder 解码
	str4 := `{"name":"赵六","age":28}`
	var person4 Person
	// 创建一个 string reader 作为参数
	err = json.NewDecoder(strings.NewReader(str4)).Decode(&person4)
	if err == nil {
		fmt.Println("json.NewDecoder 解码结果: ", person4.Name, person4.Age)
	}
}

 

常见问题:

1、为什么我定义了一个 struct,但是使用 json.Marshal 方法编码之后返回的是空的 byte[] ?

可能原因:struct 里面使用了小写的的字段名,如

type Person struct {
    name string
    age int
}

  需要把 字段名转为 驼峰命名,如果需要编码之后的字段名是小写的,可以给 struct 加个 tag,如上面的例子那样 `json:"name"`

 

posted @ 2018-06-17 11:28  佚名000  阅读(458)  评论(0编辑  收藏  举报