在golang中将一个对象转换成json是一件非常常见的事情,相信大部分golang开发者都会遇到。本篇文章就来分享一下在golang中如何将一个对象转换成json的方法和技巧。
使用encoding/json包首先来看golang标准库中提供的encoding/json包。这个包提供了非常简单易用的函数和类型,可以让我们轻松地将一个对象转换成json格式的字符串或者将一个json格式的字符串转换成一个对象。
需要注意的是,对象必须是可导出的(即首字母大写),否则json包无法访问它的字段。
下面是使用encoding/json包将student对象转换成json格式字符串的简单示例代码:
package mainimport ( "encoding/json" "fmt")type student struct { name string age int score float64}func main() { s := student{ name: "tom", age: 18, score: 90.5, } b, err := json.marshal(s) if err != nil { fmt.println("json.marshal failed:", err) return } fmt.println(string(b))}
输出:
{"name":"tom","age":18,"score":90.5}
可以看到,json包提供的marshal函数可以将一个结构体对象序列化成json格式的字符串。
对于一个复杂的对象,我们也可以很容易地把它序列化成json格式的字符串。比如下面这个由多个student对象组成的数组:
package mainimport ( "encoding/json" "fmt")type student struct { name string age int score float64}func main() { students := []student{ {name: "tom", age: 18, score: 90.5}, {name: "jerry", age: 19, score: 96.5}, {name: "alice", age: 17, score: 85.5}, } b, err := json.marshal(students) if err != nil { fmt.println("json.marshal failed:", err) return } fmt.println(string(b))}
输出:
[{"name":"tom","age":18,"score":90.5},{"name":"jerry","age":19,"score":96.5},{"name":"alice","age":17,"score":85.5}]
同样的,我们可以使用json包提供的unmarshal函数将一个json格式的字符串解析成一个对象。例如:
package mainimport ( "encoding/json" "fmt")type point struct { x int `json:"x"` y int `json:"y"`}type line struct { start point `json:"start"` end point `json:"end"`}func main() { jsonstr := ` { "start": { "x": 1, "y": 2 }, "end": { "x": 3, "y": 4 } }` var line line err := json.unmarshal([]byte(jsonstr), &line) if err != nil { fmt.println("json.unmarshal failed:", err) return } fmt.printf("%#v", line)}
输出:
main.line{start:main.point{x:1, y:2}, end:main.point{x:3, y:4}}
该示例代码中,我们定义了一个line对象,它包含了两个point对象。使用json包提供的unmarshal函数将一个json格式的字符串解析成line对象,然后进行输出。
通过结构体tag进行自定义json序列化和反序列化如果我们想要自定义json格式的输出,比如修改某个字段的名字,该怎么办呢?这时候,golang中的struct tag就派上用场了。
在golang中,struct tag是一种对struct字段进行注释的方式,可以通过在字段的类型后添加字符串的方式实现。在使用json包序列化和反序列化时,我们可以使用struct tag来控制序列化和反序列化的过程。
下面是一个简单的示例代码,演示如何使用struct tag控制json序列化和反序列化的过程:
package mainimport ( "encoding/json" "fmt")type student struct { name string `json:"name"` age int `json:"age"` score float64}func main() { s := student{ name: "tom", age: 18, score: 90.5, } fmt.println("*** 序列化 ***") b, err := json.marshal(s) if err != nil { fmt.println("json.marshal failed:", err) return } fmt.println(string(b)) fmt.println("*** 反序列化 ***") jsonstr := `{"name":"tom","age":18,"score":90.5}` var student student err = json.unmarshal([]byte(jsonstr), &student) if err != nil { fmt.println("json.unmarshal failed:", err) return } fmt.printf("%#v", student)}
输出:
*** 序列化 ***{"name":"tom","age":18,"score":90.5}*** 反序列化 ***main.student{name:"tom", age:18, score:90.5}
这里,我们将student对象中的name字段标注成name,这样使用json.marshal函数序列化时,就会将它的名字变成name。同样,使用json.unmarshal函数反序列化时,也会自动识别name为name字段。
通过struct tag的形式,我们还可以控制json输出中字段的可见性。例如:
package mainimport ( "encoding/json" "fmt")type student struct { name string `json:"name,omitempty"` age int `json:"age"` score float64}func main() { s := student{ age: 18, score: 90.5, } fmt.println("*** 序列化 ***") b, err := json.marshal(s) if err != nil { fmt.println("json.marshal failed:", err) return } fmt.println(string(b)) fmt.println("*** 反序列化 ***") jsonstr := `{"name":"tom","age":18,"score":90.5}` var student student err = json.unmarshal([]byte(jsonstr), &student) if err != nil { fmt.println("json.unmarshal failed:", err) return } fmt.printf("%#v", student)}
输出:
*** 序列化 ***{"age":18,"score":90.5}*** 反序列化 ***main.student{name:"tom", age:18, score:90.5}
这里我们将name字段标注成omitempty,意思是如果name字段的值是零值(即),那么在json输出时就忽略这个字段。
使用第三方库当我们需要进行更复杂的json序列化和反序列化时,golang标准库或许就有点力不足了。这时候,我们可以借助一些第三方库,来帮助我们实现更灵活的操作。
下面是一个使用第三方库进行json序列化和反序列化的示例代码,这个示例代码使用了json-iterator/go包,这个包是目前最快的golang json库之一。
package mainimport ( "fmt" "github.com/json-iterator/go")type student struct { name string `json:"name"` age int `json:"age"` score float64 `json:"score,omitempty"`}func main() { student := student{ name: "tom", age: 18, score: 0, } fmt.println("*** 序列化 ***") json := jsoniter.configcompatiblewithstandardlibrary b, err := json.marshal(student) if err != nil { fmt.println("json.marshal failed:", err) return } fmt.println(string(b)) fmt.println("*** 反序列化 ***") jsonstr := `{"name":"tom","age":18}` err = json.unmarshal([]byte(jsonstr), &student) if err != nil { fmt.println("json.unmarshal failed:", err) return } fmt.printf("%#v", student)}
输出:
*** 序列化 ***{"name":"tom","age":18}*** 反序列化 ***main.student{name:"tom", age:18, score:0}
需要注意的是,使用第三方库虽然可以实现更灵活的json操作,但同时也可能会引入性能降低或代码复杂度增加等问题,需要根据具体场景进行选择。
本文介绍了几种golang中将对象转换成json的方法和技巧,希望本文能够对读者有所帮助。
以上就是golang对象转json的详细内容。
