golang 解析json

golang 解析json

golang 解析json

简介

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。在前后端分离的开发模式中,常常需要通过json格式进行数据传输。而在Golang中,解析json数据非常简单。本文将详细介绍在Golang中如何解析json。

JSON基本结构

JSON数据由key-value对组成,使用大括号{}包裹。可以使用逗号分隔不同的key-value对。key是一个字符串,使用双引号包裹;value可以是字符串、数字、布尔值、对象或者数组。

例如,下面是一个简单的JSON数据:

{
  "name": "Alice",
  "age": 25,
  "married": false,
  "address": {
    "city": "Beijing",
    "country": "China"
  },
  "hobbies": ["reading", "traveling"]
}

Golang中的Json解析

Golang中有一个标准库encoding/json用于处理json数据。可以使用它提供的函数来解析和生成json数据。

解析Json到结构体

首先我们需要定义一个结构体来存储Json数据。结构体的字段名需要和Json数据的key对应。

type Person struct {
  Name     string   `json:"name"`
  Age      int      `json:"age"`
  Married  bool     `json:"married"`
  Address  Address  `json:"address"`
  Hobbies  []string `json:"hobbies"`
}

type Address struct {
  City    string `json:"city"`
  Country string `json:"country"`
}

然后,我们可以使用json.Unmarshal()函数将Json数据解析到结构体中。

jsonStr := `{
  "name": "Alice",
  "age": 25,
  "married": false,
  "address": {
    "city": "Beijing",
    "country": "China"
  },
  "hobbies": ["reading", "traveling"]
}`

var person Person
err := json.Unmarshal([]byte(jsonStr), &person)
if err != nil {
  fmt.Println("解析json失败:", err)
} else {
  fmt.Println("解析json成功!")
  fmt.Println("Name:", person.Name)
  fmt.Println("Age:", person.Age)
  fmt.Println("Married:", person.Married)
  fmt.Println("Address:", person.Address.City, person.Address.Country)
  fmt.Println("Hobbies:", person.Hobbies)
}

运行结果:

解析json成功!
Name: Alice
Age: 25
Married: false
Address: Beijing China
Hobbies: [reading traveling]

解析Json到接口变量

如果我们不知道Json数据的结构,可以将其解析到一个空接口变量中。

jsonStr := `{
  "name": "Alice",
  "age": 25,
  "married": false,
  "address": {
    "city": "Beijing",
    "country": "China"
  },
  "hobbies": ["reading", "traveling"]
}`

var obj interface{}
err := json.Unmarshal([]byte(jsonStr), &obj)
if err != nil {
  fmt.Println("解析json失败:", err)
} else {
  fmt.Println("解析json成功!")
  fmt.Println(obj)
}

运行结果:

解析json成功!
map[name:Alice age:25 married:false address:map[city:Beijing country:China] hobbies:[reading traveling]]

解析Json数组

有时候,Json数据是一个数组格式。我们可以使用切片(slice)来存储Json数组。

jsonStr := `[
  {
    "name": "Alice",
    "age": 25,
    "married": false
  },
  {
    "name": "Bob",
    "age": 30,
    "married": true
  }
]`

var persons []Person
err := json.Unmarshal([]byte(jsonStr), &persons)
if err != nil {
  fmt.Println("解析json失败:", err)
} else {
  fmt.Println("解析json成功!")
  for _, p := range persons {
    fmt.Println("Name:", p.Name)
    fmt.Println("Age:", p.Age)
    fmt.Println("Married:", p.Married)
  }
}

运行结果:

解析json成功!
Name: Alice
Age: 25
Married: false
Name: Bob
Age: 30
Married: true

Json操作的注意事项

字段的Tag

在解析Json数据时,我们可以使用字段的Tag来指定Json数据中的key。字段的Tag是一个字符串,被反引号包裹,写在字段定义的后面。

例如,在上面的示例中,我们为结构体字段添加了Tag:

type Person struct {
  Name     string   `json:"name"`
  Age      int      `json:"age"`
  Married  bool     `json:"married"`
  Address  Address  `json:"address"`
  Hobbies  []string `json:"hobbies"`
}

字段的默认值

当解析Json数据时,如果字段在Json数据中不存在或者类型不匹配,则会使用字段的默认值。

例如,下面的Json数据中没有address字段:

jsonStr := `{
  "name": "Alice",
  "age": 25,
  "married": false,
  "hobbies": ["reading", "traveling"]
}`

我们可以为字段设置默认值,当Json数据中没有这个字段时,将使用默认值:

type Person struct {
  Name     string   `json:"name"`
  Age      int      `json:"age"`
  Married  bool     `json:"married"`
  Address  Address  `json:"address"`
  Hobbies  []string `json:"hobbies"`
}

type Address struct {
  City    string `json:"city"`
  Country string `json:"country"`
}

var person Person
person.Address = Address{City: "Unknown", Country: "Unknown"}  // 设置默认值

err := json.Unmarshal([]byte(jsonStr), &person)
if err != nil {
  fmt.Println("解析json失败:", err)
} else {
  fmt.Println("解析json成功!")
  fmt.Println("Name:", person.Name)
  fmt.Println("Age:", person.Age)
  fmt.Println("Married:", person.Married)
  fmt.Println("Address:", person.Address.City, person.Address.Country)
  fmt.Println("Hobbies:", person.Hobbies)
}

运行结果:

解析json成功!
Name: Alice
Age: 25
Married: false
Address: Unknown Unknown
Hobbies: [reading traveling]

结论

本文介绍了在Golang中如何解析Json数据。通过使用encoding/json包提供的函数,我们可以将Json数据解析到结构体中,或者解析到一个空接口变量中。同时,我们还可以设置字段的Tag和默认值来处理一些特殊情况。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程