什么是json

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它基于JavaScript的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。由于json是一种文本格式,所以可以轻松地在网络上传输和存储。

使用golang读取json数据

在golang中,可以使用标准库中的enc/json包来处理json数据。该包提供了一系列函数来编解码json格式的数据。下面是一个示例程序,演示如何读取json数据:

package main

import (
    "fmt"
    "encoding/json"
)

type Person struct {
    Name string
    Age int
}

func main() {
    jsonData := []byte(`{"name":"张三","age":18}`)
    var p Person
    err := json.Unmarshal(jsonData, &p)
    if err != nil {
        fmt.Println("解析json数据失败:", err)
        return
    }
    fmt.Println(p.Name)
    fmt.Println(p.Age)
}

代码解释:

  1. 定义一个结构体Person,用来保存从json数据中读取出来的数据;
  2. 定义一个json数据,由于json数据是一种文本格式,所以需要将其转换成[]byte类型;
  3. 使用json.Unmarshal函数将json数据解码到结构体p中;
  4. 输出p中的字段。

使用golang写入json数据

在golang中,可以使用标准库中的enc/json包来处理json数据。该包提供了一系列函数来编解码json格式的数据。下面是一个示例程序,演示如何写入json数据:

package main

import (
    "fmt"
    "encoding/json"
)

type Person struct {
    Name string
    Age int
}

func main() {
    p := Person{
        Name: "张三",
        Age: 18,
    }
    jsonData, err := json.Marshal(p)
    if err != nil {
        fmt.Println("生成json数据失败:", err)
        return
    }
    fmt.Println(string(jsonData))
}

代码解释:

  1. 定义一个结构体Person,用来保存将要被编码为json的数据;
  2. 创建一个Person类型的实例p并赋值;
  3. 使用json.Marshal函数将结构体p编码为json数据;
  4. 将编码后的json数据转换成字符串并输出。

处理复杂json数据

在实际开发中,json数据有时比较复杂,不止包含基本类型,还包含嵌套的复杂类型。对于这种情况,golang的enc/json包提供了类似于其他语言中的Map类型的map[string]interface{}类型来处理复杂的json数据。

下面是一个示例程序,展示如何读写复杂的json数据:

package main

import (
    "fmt"
    "encoding/json"
)

type Person struct {
    Name string
    Age int
    Parents []string
}

func main() {
    jsonData := []byte(`{"name":"张三","age":18,"parents":["张父","张母"]}`)
    var p map[string]interface{}
    err := json.Unmarshal(jsonData, &p)
    if err != nil {
        fmt.Println("解析json数据失败:", err)
        return
    }
    var person Person
    person.Name = p["name"].(string)
    person.Age = int(p["age"].(float64))
    parents := p["parents"].([]interface{})
    for _, v := range parents {
        person.Parents = append(person.Parents, v.(string))
    }
    fmt.Println(person)
    jsonData, err = json.Marshal(person)
    if err != nil {
        fmt.Println("生成json数据失败:", err)
        return
    }
    fmt.Println(string(jsonData))
}

代码解释:

  1. 定义一个结构体Person,用来保存将要被编码为json的数据,其中parents是一个字符串类型的切片;
  2. 定义一个json数据,由于json数据是一种文本格式,所以需要将其转换成[]byte类型;
  3. 使用json.Unmarshal函数将json数据解码到map[string]interface类型的变量p中;
  4. 根据p中的数据构造Person类型的实例person;
  5. 将Person类型的实例person编码为json数据并输出。