目录

Json 文件
// 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

  1. 先读取文件,将文件转为 []byte 类型
  2. 通过 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)
}