正如上一个小节所示,分析JSON的方法和分析XML的方法是非常相似的。同样地,如图7-9所示,创建JSON的方法和创建XML的方法也是相似的。
图7-9 使用Go创建JSON:创建结构并将其封装为JSON数据
代码清单7-12展示了把Go结构封装为JSON数据的具体代码。
代码清单7-12 将结构封装为JSON
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
)
type Post struct {//创建结构并向里面填充数据
Id int `json:"id"`
Content string `json:"content"`
Author Author `json:"author"`
Comments []Comment `json:"comments"`
}
type Author struct {
Id int `json:"id"`
Name string `json:"name"`
}
type Comment struct {
Id int `json:"id"`
Content string `json:"content"`
Author string `json:"author"`
}
func main() {
post := Post{
Id: 1,
Content: "Hello World!",
Author: Author{
Id: 2,
Name: "Sau Sheong",
},
Comments: []Comment{
Comment{
Id: 3,
Content: "Have a great day!",
Author: "Adam",
},
Comment{
Id: 4,
Content: "How are you today?",
Author: "Betty",
},
},
}
output, err := json.MarshalIndent(&post, "", "\t\t")//把结构封装为由字节切片组成的JSON数据
if err != nil {
fmt.Println("Error marshalling to JSON:", err)
return
}
err = ioutil.WriteFile("post.json", output, 0644)
if err != nil {
fmt.Println("Error writing JSON to file:", err)
return
}
}
跟处理XML时的情况一样,这个封装程序使用的结构和之前分析JSON时使用的结构是相同的。程序首先会创建一些结构,然后通过调用MarshalIndent
函数将结构封装为由字节切片组成的JSON数据(json库的MarshalIndent
函数和xml库的MarshalIndent
函数的作用是类似的)。最后,程序会将封装所得的JSON数据存储到指定的文件中。
正如我们可以通过编码器手动创建XML一样,我们也可以通过编码器手动将Go结构编码为JSON数据,图7-10展示了这个过程。
图7-10 使用Go创建JSON数据:通过编码器把结构编码为JSON
代码清单7-13展示了json.go
文件中包含的代码,这些代码可以根据给定的Go结构创建相应的JSON文件。
代码清单7-13 使用Encoder
把结构编码为JSON
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
)
type Post struct {//创建结构并向里面填充数据
Id int `json:"id"`
Content string `json:"content"`
Author Author `json:"author"`
Comments []Comment `json:"comments"`
}
type Author struct {
Id int `json:"id"`
Name string `json:"name"`
}
type Comment struct {
Id int `json:"id"`
Content string `json:"content"`
Author string `json:"author"`
}
func main() {
post := Post{
Id: 1,
Content: "Hello World!",
Author: Author{
Id: 2,
Name: "Sau Sheong",
},
Comments: []Comment{
Comment{
Id: 3,
Content: "Have a great day!",
Author: "Adam",
},
Comment{
Id: 4,
Content: "How are you today?",
Author: "Betty",
},
},
}
jsonFile, err := os.Create("post.json")//创建用于存储数据的JSON文件
if err != nil {
fmt.Println("Error creating JSON file:", err)
return
}
encoder := json.NewEncoder(jsonFile)//根据给定的JSON文件创建出相应的编码器
err = encoder.Encode(&post)
if err != nil {//把结构编码到JSON文件里面
fmt.Println("Error encoding JSON to file:", err)
return
}
}
跟之前一样,程序会创建一个用于存储JSON数据的JSON文件,并通过把这个文件传递给NewEncoder
函数来创建一个编码器。接着,程序会调用编码器的Encode
方法,并向其传递一个指向Post
结构的引用。在此之后,Encode
方法会从结构里面提取数据并将其编码为JSON数据,然后把这些JSON数据写入创建编码器时给定的JSON文件里面。
关于分析和创建XML和JSON的介绍到这里就结束了。虽然最近这两节介绍的内容可能会因为模式相似而显得有些乏味,但这些基础知识对于接下来的一节学习如何创建Go Web服务是不可或缺的,因此花时间学习和掌握这些知识是非常值得的。