目录
// rabbitmq_queues.json
{
"queues": [{
"name": "001",
"vhost": "/test",
"durable": true,
"auto_delete": false,
"arguments": {
"x-dead-letter-exchange": "dlx-fanout-test-exchange",
"x-dead-letter-routing-key": "001",
"x-queue-type": "classic"
}
},
{
"name": "dlx-001",
"vhost": "/test",
"durable": true,
"auto_delete": false,
"arguments": {
"x-queue-type": "classic"
}
}
]
}
已知或固定的 json 结构解析
推荐一个好用的 json 和 golang struct 转换的网站:https://oktools.net/json2go
Example code
- 先读取文件,将文件转为 []byte 类型
- 通过 jsoniter 包解析
package main
import (
"bytes"
"fmt"
jsoniter "github.com/json-iterator/go"
"io"
"os"
)
func main() {
//jsoniter.Unmarshal()
var rq rabbitMqQueues
jsonContent, err := readFileToByte("rabbitmq_queues.json")
if err != nil {
fmt.Printf("open file error: %v\n", err.Error())
return
}
if err := jsoniter.Unmarshal(jsonContent, &rq); err != nil {
fmt.Printf("json umarshal error: %v", err.Error())
return
}
fmt.Println(rq)
}
type rabbitMqQueues struct {
Queues []Queues `json:"queues"`
}
type Arguments map[string]interface{}
type Queues struct {
Name string `json:"name"`
Vhost string `json:"vhost"`
Durable bool `json:"durable"`
AutoDelete bool `json:"auto_delete"`
Arguments Arguments `json:"arguments,omitempty"`
}
func readFileToByte(path string) ([]byte, error) {
f, err := os.Open(path)
if err != nil {
return nil, err
}
return io.ReadAll(f)
}
解析未知 json
未知的 json 使用 map[string]interface 解析
golang 没有直接的 map 转 struct,需要通过反射来实现。这里不实现
package main
import (
"bytes"
"fmt"
jsoniter "github.com/json-iterator/go"
"io"
"os"
)
func main() {
//jsoniter.Unmarshal()
var rq map[string]interface{}
jsonContent, err := readFileToByte("rabbitmq_queues.json")
if err != nil {
fmt.Printf("open file error: %v\n", err.Error())
return
}
if err := jsoniter.Unmarshal(jsonContent, &rq); err != nil {
fmt.Printf("json umarshal error: %v", err.Error())
return
}
fmt.Println(rq)
}
func readFileToByte(path string) ([]byte, error) {
f, err := os.Open(path)
if err != nil {
return nil, err
}
return io.ReadAll(f)
}