golang json 类型转换
在 golang 中,JSON 是一种重要的数据格式,因为其可以方便的进行数据传输和存储。在处理 jsON 数据时,类型转换是非常常见的操作,本文将介绍 Golang 中的 JSON 类型转换。
JSON 数据类型
在进行 JSON 类型转换之前,我们需要了解 JSON 中的数据类型。JSON 数据类型与 Golang 中的数据类型不完全对应,JSON 中有以下 6 种数据类型:
- 对象( Object ):由大括号 {} 包围,表示键值对集合,键值对之间使用逗号隔开。
- 数组( Array ):由中括号 [] 包围,表示值的有序列表,值之间使用逗号隔开。
- 字符串( String ):由双引号 " 包围,表示字符串值。
- 数值( Number ):表示数字值,可以为整数或浮点数。
- 布尔( Boolean ):表示布尔值 true 或 false。
- 空值( Null ):表示空对象或空值。
在 Golang 中,我们可以使用以下类型来表示 JSON 数据类型:
- 对象:map[string]interface{}
- 数组:[]interface{}
- 字符串:string
- 数值:float64
- 布尔:bool
- 空值:nil
JSON 解析与编码
在进行 JSON 类型转换之前,首先需要了解 JSON 解析与编码。
JSON 解析
通过 encoding/json
包中的 Decode
方法,可以将一个字符串或字节数组解析为 JSON 对象。例如:
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string
Age int
Address string
}
func main() {
jsonStr := `{"Name": "Tom", "Age": 18, "Address": "Beijing"}`
var p Person
err := json.Unmarshal([]byte(jsonStr), &p)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(p.Name, p.Age, p.Address)
}
上述代码中,Unmarshal
方法将 JSON 字符串解析为 Person
对象,当然如果我们只想解析为 map[string]interface{}
或 []interface{}
等基础数据类型也是可以的。
JSON 编码
通过 encoding/json
包中的 Encode
方法,可以将一个 JSON 对象编码为一个字符串或字节数组。例如:
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string
Age int
Address string
}
func main() {
p := Person{Name: "Tom", Age: 18, Address: "Beijing"}
jsonString, err := json.Marshal(p)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(jsonString))
}
上述代码中,Marshal
方法将 Person
对象编码为 JSON 字符串。当然,如果我们只想编码 map[string]interface{}
或 []interface{}
等基础数据类型也是可以的。
JSON 类型转换
在解析 JSON 数据后,我们可以将 JSON 对象转换为 Golang 中的基础数据类型,例如 int
、string
、bool
等,也可以将 JSON 数组转换为 Golang 中的数组,或是将 JSON 对象转换为 Golang 中的结构体。
将 JSON 数字转换为 int 和 float64
将 JSON 中的数字转换为 Golang 中的数据类型有两种常用方式,分别是 float64()
和 int()
。例如:
import (
"encoding/json"
"fmt"
)
func main() {
jsonStr := `{"float": 1.23, "int": 456}`
var data map[string]interface{}
err := json.Unmarshal([]byte(jsonStr), &data)
if err != nil {
fmt.Println(err)
return
}
floatValue := data["float"].(float64)
intValue := int(data["int"].(float64))
fmt.Println(floatValue, intValue)
}
上述代码中,我们首先将 JSON 字符串解析为 map[string]interface{}
类型的 data
对象,然后通过断言将 data
对象中的 float
转换为 float64
类型的 floatValue
和 int
转换为 int
类型的 intValue
。
将 JSON 字符串转换为 string
将 JSON 中的字符串转换为 Golang 中的 string
类型很简单,直接通过断言即可。例如:
import (
"encoding/json"
"fmt"
)
func main() {
jsonStr := `{"name": "Tom"}`
var data map[string]interface{}
err := json.Unmarshal([]byte(jsonStr), &data)
if err != nil {
fmt.Println(err)
return
}
name := data["name"].(string)
fmt.Println(name)
}
上述代码中,我们将 JSON 字符串解析为 map[string]interface{}
类型的 data
对象,然后通过断言将 data
对象中的 name
转换为 string
类型的 name
。
将 JSON 数组转换为 []interface{}
将 JSON 中的数组转换为 Golang 中的 []interface{}
类型很简单,直接通过断言即可。例如:
import (
"encoding/json"
"fmt"
)
func main() {
jsonStr := `["Tom", 18, 1.23]`
var data []interface{}
err := json.Unmarshal([]byte(jsonStr), &data)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(data)
}
上述代码中,我们将 JSON 字符串解析为 []interface{}
类型的 data
数组,通过输出可以看到 data
数组的每个元素都被正确解析了。
将 JSON 对象转换为 map[string]interface{}
将 JSON 中的对象转换为 Golang 中的 map[string]interface{}
类型也很简单,直接通过断言即可。例如:
import (
"encoding/json"
"fmt"
)
func main() {
jsonStr := `{"name": "Tom", "age": 18}`
var data map[string]interface{}
err := json.Unmarshal([]byte(jsonStr), &data)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(data)
}
上述代码中,我们将 JSON 字符串解析为 map[string]interface{}
类型的 data
对象,通过输出可以看到 data
对象中包含了两个键值对 name
和 age
。
将 JSON 对象转换为结构体
将 JSON 中的对象转换为 Golang 中的结构体需要指定结构体的字段,然后通过断言将结构体字段值进行赋值。例如:
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string
Age int
Address string
}
func main() {
jsonStr := `{"Name": "Tom", "Age": 18, "Address": "Beijing"}`
var data map[string]interface{}
err := json.Unmarshal([]byte(jsonStr), &data)
if err != nil {
fmt.Println(err)
return
}
p := Person{
Name: data["Name"].(string),
Age: int(data["Age"].(float64)),
Address: data["Address"].(string),
}
fmt.Println(p)
}
上述代码中,我们将 JSON 字符串解析为 map[string]interface{}
类型的 data
对象,然后通过断言将 data
对象中的键值对分别赋值给结构体 Person
的字段。
总结
Golang 中的 JSON 类型转换非常常见,因此在进行 JSON 数据处理时应该对其进行充分的了解。本文通过介绍 Golang 中 JSON 的数据类型、JSON 解析与编码方法及 JSON 类型转换等内容,希望可以帮助读者更好的应用 Golang 处理 JSON 数据。
以上就是golang json 类型转换的详细内容,更多请关注其它相关文章!
相关文章