zoukankan      html  css  js  c++  java
  • 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
    ", 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"`

  • 相关阅读:
    password
    bzoj 1458: 士兵占领
    国家集训队2011 happiness
    cogs 2051. 王者之剑
    uva 10779 Collectors Problem
    [Jxoi2012]奇怪的道路
    天神下凡
    藏宝图
    黑红树
    愤怒的小鸟
  • 原文地址:https://www.cnblogs.com/eleven24/p/9192481.html
Copyright © 2011-2022 走看看