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()
}
功能图示
更多关于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在设计时考虑了性能因素,但在处理大型数据时仍需注意:
- 对于大型JSON/YAML/XML文件,考虑使用流式处理
- 重复使用Bafi实例而不是每次都创建新实例
- 对于高性能场景,直接使用专门的库可能更高效
总结
Bafi为Go开发者提供了一个统一的接口来处理多种数据格式,简化了格式转换和模板渲染的复杂性。它的主要优点包括:
- 统一的API处理多种格式
- 简单的模板渲染功能
- 灵活的配置选项
- 良好的错误处理
通过上述示例,您可以快速上手Bafi并在项目中使用它来处理各种数据格式转换需求。