Golang 解析 json 文件的两种方法

Posted 沉淅尘

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang 解析 json 文件的两种方法相关的知识,希望对你有一定的参考价值。

目录

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)

以上是关于Golang 解析 json 文件的两种方法的主要内容,如果未能解决你的问题,请参考以下文章

Java构造和解析Json数据的两种方法详解一

Android中使用Gson解析JSON数据的两种方法

如何让golang 把变量解析为json,并输出为文件。

golang 每2秒调用一次函数的两种方法

golang 每2秒调用一次函数的两种方法

Golang yaml与toml解析