page contents

Golang解析json

JSON 是一种使用 UTF-8 编码的纯文本格式,采用完全独立于语言的文本格式,由于写起来比 XML 格式方便,并且更为紧凑,同时所需的处理时间也更少,致使 JSON 格式越来越流行,特别是在通过网...

attachments-2021-07-dCjifX2860e912873cc61.png

JSON 是一种使用 UTF-8 编码的纯文本格式,采用完全独立于语言的文本格式,由于写起来比 XML 格式方便,并且更为紧凑,同时所需的处理时间也更少,致使 JSON 格式越来越流行,特别是在通过网络连接传送数据方面。

Go语言内建对 JSON 的支持,使用内置的 encoding/json 标准库,开发人员可以轻松使用Go程序生成和解析 JSON 格式的数据。

生成json数据

go语言中将 结构体 转为 json 的过程叫编组(marshaling)。编组通过调用 json.Marshal 函数完成。

package main
 
import (
   "encoding/json"
   "fmt"
   "log"
)
 
type Person struct {
   Name    string
   Year    int  `json:"age"`
   Child   bool `json:"isChild,omitempty"`
   Parents []string
}
 
var persons = []Person{
   {Name: "Albma", Year: 2018, Child: true,
      Parents: []string{"Jonh", "Lucy"}},
   {Name: "Tom", Year: 1997, Child: false,
      Parents: []string{"Newman"}},
   {Name: "Bullitt", Year: 2008,
      Parents: []string{"Steve", "Jim"}},
   // ...
}
func main() {
//编组
   data, err := json.Marshal(persons)
   if err != nil {
      log.Fatalf("JSON marshaling failed: %s", err)
   }
   fmt.Printf("%s\n", data)
 
}

上面的代码输出

[
    {
        "Name": "Casablanca",
        "age": 2018,
        "isChild": true,
        "Parents": [
            "Jonh",
            "Lucy"
        ]
    },
    {
        "Name": "Tom",
        "age": 1997,
        "Parents": [
            "Newman"
        ]
    },
    {
        "Name": "Bullitt",
        "age": 2008,
        "Parents": [
            "Steve",
            "Jim"
        ]
    }
]

这里我们可以看出,结构体中的Year成员对应json结构中的age,Child对应isChild。omitempty,表示当Go语言结构体成员为空或零值时不生成JSON对象(这里false为零值)。

通过示例,我们知道了怎么去构造json结构的数据了。那么,json结构的数据,我们怎么解析呢。

将JSON数据解码为Go语言的数据结构,Go语言中一般叫解码(unmarshaling),通过 json.Unmarshal 函数完成。

//解码
var person []Person
json.Unmarshal(data, &person)
fmt.Println(person)

我们把刚才生成的json数据再解析下,结果如下:

[{Casablanca 2018 true [Jonh Lucy]} {Tom 1997 false [Newman]} {Bullitt 2008 false [Steve Jim]}]

当然我们在实际应用中不止进行json数据的读取,如果需要读写json数据文件,我们应该如何操作呢?

func writeToFile() {
   // 创建文件
   filePtr, err := os.Create("info.json")
   if err != nil {
      fmt.Println("文件创建失败", err.Error())
      return
   }
   defer filePtr.Close()
   // 创建Json编码器
   encoder := json.NewEncoder(filePtr)
   err = encoder.Encode(persons)
   if err != nil {
      fmt.Println("编码错误", err.Error())
   } else {
      fmt.Println("编码成功")
   }
}
func ReadFromFile() {
   filePtr, err := os.Open("./info.json")
   if err != nil {
      fmt.Println("文件打开失败 [Err:%s]", err.Error())
      return
   }
   defer filePtr.Close()
   var persons []Person
   // 创建json解码器
   decoder := json.NewDecoder(filePtr)
   err = decoder.Decode(&persons)
   if err != nil {
      fmt.Println("解码失败", err.Error())
   } else {
      fmt.Println("解码成功")
      fmt.Println(persons)
   }
}

好了,具体效果就不展示了。

更多相关技术内容咨询欢迎前往并持续关注六星社区了解详情。

程序员编程交流QQ群:805358732

如果你想用Python开辟副业赚钱,但不熟悉爬虫与反爬虫技术,没有接单途径,也缺乏兼职经验
关注下方微信公众号:Python编程学习圈,获取价值999元全套Python入门到进阶的学习资料以及教程,还有Python技术交流群一起交流学习哦。

attachments-2022-06-kxcmKtG362ad375e71f9a.jpeg

  • 发表于 2021-07-10 11:23
  • 阅读 ( 436 )
  • 分类:Golang

0 条评论

请先 登录 后评论
轩辕小不懂
轩辕小不懂

2403 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1474 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章