go数据和json格式数据之间的转换

 提示:转载请注明原文链接

 本文永久链接:https://www.360us.net/article/33.html

go有一个官方包来操作json格式的数据,包位于encoding/json。


JSON编码


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

返回用JSON编码v之后的值。


类型转换规则:

  • boolean值会编码成JSON的boolean;

  • float,integer会编码成JSON的number;

  • string值会编码成UTF-8JSON字符串,无效的字节用Unicode替换,"<"和">"编码成"\u003c" and "\u003e","&"编码成"\u0026";

  • array和slice会编码成JSON array,[]byte编码成base64字符串,空的slice编码成null;

  • struct会编码成JSON object。


空值是指false,0,空指针或者空interface,任何长度为0的array,slice,map或者string。

json对象默认的key字符串是strut的字段名,也可以自己指定名字,方法是在每个字段最后用“json”标签指定名字:

比如:

type Personal struct {
    Name string `json:"new"`
    Age int
    Height int
}

把上面的struct编码成json字符串时,Name字段的key是new,而不是Name。

"json"标签的用法:

1、`json:"-"`:编码的时候会忽略这个字段。

2、`json:"newName"`:指定字段在JSON字符串的key名字。

3、`json:"newName,omitempty"`:如果这个字段是空值,则不编码到JSON里面,否则用newName为名字编码。

4、`json:",omitempty"`:同上,不为空的话,这个字段的key还是用默认的struct字段名。

5、`json:",string"`:编码成字符串,这个string选项只适用字符串,浮点型和整型数据。

struct字段需要可导出才能编码成json,否则会忽略。


package main
import (
    "fmt"
    "encoding/json"
)
type Personal struct {
    Name string
    Age  int `json:",omitempty"`
    T    []string
    N    float64 `json:",string"`
    S    []byte
}
func main() {
var p = Personal{
    Name: "Jack",
    //Age : 25,
    T : []string{"a", "b", "c"},
    N : 55.5,
    S : []byte("abc我哈哈哈你没sd"),
}
j, _ := json.Marshal(p)
fmt.Println(string(j))
}


json解码


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

从data解码JSON,结果存放在v,所以v参数需要引用传递参数。


转换规则和Marshal的规则相反。

还有其他一些规则:

  • 如果是解析到一个指针,Unmarshal首先会检查是否是json字符null,如果是的话指针会设置为nil,其他情况Unmarshal会把值填充到指针所指的位置,如果是一个空指针则会分配一个新的位置。

  • 如果是解析到struct,Unmarshal会用struct的字段名或者`json`标签指定的名字和json的key相匹配。

  • 如果是解析到interface值,转化规则如下:

  1. bool对应JSON的boolean,

  2. float64对应JSON的number,

  3. string对应JSON的string,

  4. []interface{}对应JSON的array

  5. map[string]interface{}对应JSON的object

  6. nil对应JSON的null。

  • 如果一个JSON值没有适用的给定类型,或者JSON的数值超过了目标类型的范围,Unmarshal会跳过这个字段或者尽可能的解码。

    var jsonBlob = []byte(`[
		{"Name": "Platypus", "Order": "Monotremata"},
		{"Name": "Quoll",    "Order": "Dasyuromorphia"}
	]`)
	type Animal struct {
		Name  string
		Order string
	}
	var animals []Animal
	err := json.Unmarshal(jsonBlob, &animals)
	if err != nil {
		fmt.Println("error:", err)
	}
	fmt.Printf("%+v\n", animals)
	for _, v := range animals {
		fmt.Println(v)
		fmt.Println(v.Name)
		fmt.Println(v.Order)
	}


了解更多可以参考官方博客的文章:http://blog.golang.org/json-and-go


 评论
暂无评论