golang通用JSON/BSON/YAML/XML格式转换模板引擎插件bafi的使用

golang通用JSON/BSON/YAML/XML格式转换模板引擎插件bafi的使用

关键特性

  • 支持多种输入格式:JSON、BSON、YAML、CSV、XML、MT940
  • 使用文本模板灵活格式化输出
  • 支持Lua自定义函数,可实现灵活的数据操作
  • 支持stdin/stdout,方便数据管道传输
  • 可将多个不同格式的输入文件合并为单个模板格式化输出文件
  • 支持chatGPT查询分析或格式化数据(实验性功能)

使用示例

基础用法

bafi.exe -i testdata.xml -t template.tmpl -o output.txt

管道用法

curl.exe -s https://api.predic8.de/shop/customers/ | bafi.exe -f json -t "?{{toXML .}}"

使用chatGPT查询

curl -s https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml | ./bafi -f xml -gk myChatGPTToken -gq "What's the current CZK rate?"

完整示例代码

模板示例 (template.tmpl)

{{/* 这是一个简单的模板示例 */}}
{{range .customers}}
Customer: {{.name}}
Address: {{.address}}
{{end}}

Go代码示例

package main

import (
	"fmt"
	"os"
	"os/exec"
)

func main() {
	// 示例1:转换XML文件
	cmd := exec.Command("bafi", "-i", "input.xml", "-t", "template.tmpl", "-o", "output.txt")
	err := cmd.Run()
	if err != nil {
		fmt.Println("Error:", err)
	}

	// 示例2:使用管道转换JSON数据
	curlCmd := exec.Command("curl", "-s", "https://api.example.com/data")
	bafiCmd := exec.Command("bafi", "-f", "json", "-t", "{{. | toYAML}}")
	
	// 连接两个命令
	bafiCmd.Stdin, _ = curlCmd.StdoutPipe()
	bafiCmd.Stdout = os.Stdout
	
	_ = bafiCmd.Start()
	_ = curlCmd.Run()
	_ = bafiCmd.Wait()
}

功能图示

bafi功能示意图


更多关于golang通用JSON/BSON/YAML/XML格式转换模板引擎插件bafi的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang通用JSON/BSON/YAML/XML格式转换模板引擎插件bafi的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Bafi - Go语言通用格式转换模板引擎插件

Bafi 是一个强大的Go语言通用格式转换工具,支持JSON、BSON、YAML和XML等多种格式之间的相互转换。下面我将详细介绍如何使用Bafi进行数据格式转换。

安装Bafi

go get github.com/kamildrazkiewicz/bafi

基本使用示例

1. JSON转换

package main

import (
	"fmt"
	"github.com/kamildrazkiewicz/bafi"
)

func main() {
	// 创建Bafi实例
	b := bafi.New()

	// JSON字符串
	jsonStr := `{"name":"John","age":30,"city":"New York"}`

	// 将JSON转换为map
	var data map[string]interface{}
	err := b.From([]byte(jsonStr)).To(&data)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}

	fmt.Printf("Parsed data: %+v\n", data)

	// 将map转换为JSON
	jsonBytes, err := b.From(data).ToJSON()
	if err != nil {
		fmt.Println("Error:", err)
		return
	}

	fmt.Println("JSON output:", string(jsonBytes))
}

2. YAML转换

func yamlExample() {
	b := bafi.New()
	
	yamlStr := `
name: John
age: 30
city: New York
`

	// YAML转map
	var data map[string]interface{}
	err := b.From([]byte(yamlStr)).To(&data)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}

	// map转YAML
	yamlBytes, err := b.From(data).ToYAML()
	if err != nil {
		fmt.Println("Error:", err)
		return
	}

	fmt.Println("YAML output:\n", string(yamlBytes))
}

3. XML转换

func xmlExample() {
	b := bafi.New()
	
	xmlStr := `
<person>
	<name>John</name>
	<age>30</age>
	<city>New York</city>
</person>
`

	// XML转map
	var data map[string]interface{}
	err := b.From([]byte(xmlStr)).To(&data)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}

	// map转XML
	xmlBytes, err := b.From(data).ToXML()
	if err != nil {
		fmt.Println("Error:", err)
		return
	}

	fmt.Println("XML output:\n", string(xmlBytes))
}

高级功能

1. 模板渲染

Bafi支持模板渲染功能,可以动态生成内容:

func templateExample() {
	b := bafi.New()
	
	templateStr := `Hello {{.name}}! You are {{.age}} years old.`
	data := map[string]interface{}{
		"name": "John",
		"age":  30,
	}

	result, err := b.From(data).WithTemplate(templateStr).ToString()
	if err != nil {
		fmt.Println("Error:", err)
		return
	}

	fmt.Println(result) // 输出: Hello John! You are 30 years old.
}

2. 格式间转换

Bafi可以轻松在不同格式间转换:

func formatConversion() {
	b := bafi.New()
	
	jsonStr := `{"name":"John","age":30,"city":"New York"}`
	
	// JSON转YAML
	yamlBytes, err := b.From([]byte(jsonStr)).ToYAML()
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	
	fmt.Println("JSON to YAML:\n", string(yamlBytes))
	
	// YAML转XML
	xmlBytes, err := b.From(yamlBytes).ToXML()
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	
	fmt.Println("YAML to XML:\n", string(xmlBytes))
}

3. 自定义配置

func customConfig() {
	// 创建自定义配置的Bafi实例
	b := bafi.NewWithOptions(&bafi.Options{
		TagName:       "mytag", // 自定义结构体标签
		IndentJSON:    true,    // JSON缩进
		IndentSpaces:  4,       // 缩进空格数
		EscapeHTML:    false,   // 不转义HTML
		SortMapKeys:   true,    // 排序map键
	})
	
	data := map[string]interface{}{
		"name": "John",
		"age":  30,
		"html": "<div>Test</div>",
	}
	
	jsonBytes, err := b.From(data).ToJSON()
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	
	fmt.Println("Custom JSON output:\n", string(jsonBytes))
}

性能考虑

Bafi在设计时考虑了性能因素,但在处理大型数据时仍需注意:

  1. 对于大型JSON/YAML/XML文件,考虑使用流式处理
  2. 重复使用Bafi实例而不是每次都创建新实例
  3. 对于高性能场景,直接使用专门的库可能更高效

总结

Bafi为Go开发者提供了一个统一的接口来处理多种数据格式,简化了格式转换和模板渲染的复杂性。它的主要优点包括:

  1. 统一的API处理多种格式
  2. 简单的模板渲染功能
  3. 灵活的配置选项
  4. 良好的错误处理

通过上述示例,您可以快速上手Bafi并在项目中使用它来处理各种数据格式转换需求。

回到顶部